首页 > 编程 > PHP > 正文

PHP设计模式

2019-11-08 03:18:20
字体:
来源:转载
供稿:网友
1.单例模式    a.含义: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次。    b.使用场景            1.例如数据库实例,一般都会走单例模式。            2.单例模式可以减少类的实例化    c.代码示例<?phpclass DB{ public static $instance =null; public static function instance(){ $class = get_called_class(); if(empty(self::$instance[$class])){ self:$instance[$class] = new $class(); } return self:$instance[$class]; }}2.观察者模式    a.含义:观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性。观察者设计模式非常常用,在一般复杂的WEB系统中,        观察者模式可以帮你减轻代码设计的压力,降低代码耦合。    b.使用场景:        1.设计一个订单类        2.订单创建完成后,会做各种动作,比如发送EMAIL,或者改变订单状态等等。        3.原始的方法,是将这些操作都写在create函数里面        4.但是随着订单创建类的越来越庞大,这样的操作已经无法满足需求和快速变动        5.这个时候,观察者模式出现了。    c.代码示例:    <?phpheader("Content-type:text/html;charset=UTF-8");class order{ PRotected $observers = array(); //增加观察者 public function addObserver($type,$observer){ $this->observers[$type][] = $observer; } //运行观察者 public function obServer($type){ if(isset($this->observers[$type])){ foreach ($this->observers[$type] as $key => $obser) { $a = new $obser; $a->update($this); } } } //下单购买流程 public function create(){ echo '购买成功<br>'; $this->obServer('buy'); }}class orderEmail{ public function update($order){ echo "发送购买成功的一个邮件<br>"; }}class orderStatus{ public function update($order){ echo "改变订单状态<br>"; }}$ob= new order();$ob->addObserver('buy','orderEmail');$ob->addObserver('buy','orderStatus');$ob->create();3.工厂模式    a.提供获取某个对象实例的一个接口,同时使调用代码避免确定实例化基类的步骤。       工厂模式 实际上就是建立一个统一的类实例化的函数接口。统一调用,统一控制。       工厂模式是php项目开发中,最常用的设计模式,一般会配合单例模式一起使用,来加载php类库中的类。    b.应用场景        1.我们拥有一个Json类,String类,xml类。        2.如果我们不使用工厂方式实例化这些类,则需要每一个类都需要new一遍,过程不可控,类多了,到处都是new的身影        3.引进工厂模式,通过工厂统一创建对象实例。    c.代码示例<?phpclass factory{ public static function create($class){ return new $class; }}class string{ public function write(){}}class json{ public function getJsonData(){}}class xml{ public function buildXml(){}}var_dump(factory::create('string'));4.策略模式    a.含义:策略模式设计帮助构建的对象不必自身包含逻辑,而是能够根据需要利用其他对象中的算法    b.应用场景:        1.例如有一个CD类,我们类存储了CD的信息。        2.原先的时候,我们在CD类中直接调用getCD方法给出XML的结果        3.随着业务扩展,需求方提出需要JSON数据格式输出        4.这个时候我们引进了策略模式,可以让使用方根据需求自由选择是输出XML还是JSON    c.代码示例<?phpclass cd{ protected $cdArr; public function __construct($title,$info){ $this->cdArr['title'] = $title; $this->cdArr['info'] = $info; } public function getCd($typeObj){ return $typeObj->get($this->cdArr); }}class json{ public function get($return_data){ return json_encode($return_data); }}class xml{ public function get($return_data){ $xml='<?xml version="1.0" encoding="utf-8" ?>'; $xml.='<return>'; $xml.='<data>'.serialize($return_data).'</data>'; $xml.='</return>'; return $xml; }}$cd = new cd('cd_1','cd_1');echo $cd->getCd(new json)."<br>";echo $cd->getCd(new xml)."<br>";
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表