php 设计模式(学习笔记)

来源:互联网 发布:led效果图制作软件 编辑:程序博客网 时间:2024/06/15 17:03

php 有如下几种设计模式:


初听到设计模式可能让你觉得很抽象,其实设计模式就是对常见编程问题的灵活解决方案

1、工厂模式(Factory)

      他之所以被成为工厂模式是因为他负责“生产“ 对象,看看下面的例子

<?php    class Factory{            public static function factory($filename){                if(include $filename.'.php'){                    $classname = "class_".$filename;                     return new $classname;                             }else{                     throw new Exception("without this class");             }        }     }?>

   你如何调用呢: 
<?php$factoryMql= factory::factory("Mysql");?>
看到了吧,那个参数,我这里是"Mysql"实际上就是要生成对象的类的名称。


2、单例模式(Singleton)

      用于为一个类生成一个唯一的对象,使用单例模式生成一个对象后,该对象可以被其他众多对象所使用。

      例如:

     

<?phpclass Singleton{private static $ss;private function  __construct(){echo "contruct";}public static function singleton(){if(!isset(self::$ss)){$c = __CLASS__;self::$ss = new $c;}return self::$ss;}public static function normal(){  echo "I am normal function";} public static function __clone(){trigger_error("forbbiden");}} ?>

访问举例:

<?php$test = Singleton::singleton;$test->normal();?>


举例说明:由于上面的类中构造方法被声明成了private,所以我们无法用new来实例化这个类,我们只能通过访问singleton方法(例如:$test = Singleton::singleton)来获得累的对象,然后我们在用生成的对象,我这个例子里是$test来访问类中的其他方法。例如($test->normal())。禁止克隆单例对象。


3、观察者模式

     即一个对象通过添加一个方法,使自身变得可观察。当自身发生改变时,它会发送消息给已注册的观察者。观察者收到信息以后执行的操作可以完全与被观察者无关。换句话说,观察者观察被观察者,被观察者发生改变时,通知观察者,收到通知以后观察者就可以做自己想做的事情啦

      举例如下:

      

<?phpinterface  IObserver{function onChanged($sender,$args);}interface  IObserverable{function addObserver($observer);}class UserList implements IObserverable{private $_observers = array();public function addCustomer($name){foreach($this->_obervers as $obs){$obs->onChanged($this,$name);}}public function addObserver($observer){$this->_observers[]=$observer;}}class UserListLogger implements IObserver{public function onChanged($server,$args){echo "'$args' added to user list";}}$ul = new UserList();$ul->addObserver(new UserListLogger());$ul->addCustomer("Jack");?>

      看到了吧,在上个例子中,类UserListLogger 就相当于一个观察者,当类UserList 添加新的用户时(调用 addCustomer($name))方法,他会在该方法内部调用观察者的onChanged()方法,以此来通知观察者。


4、命令链模式

      命令链模式是通过一个对象发送消息、命令和请求。或者通过一组处理程序发送任意内容。每个处理程序都会自己判断自己能否处理请求。如果可以则进行处理。

     举例程序:    

<?phpinterface ICommand{function onCommand($name,$args);} class CommandChain{private $_command = array();public function addCommand($cmd){ $this->_command[]=$cmd;}public function runCommand($name,$args){foreach ($this->_command as $cmd){if($cmd->onCommand($name,$args)){return;}}}}class UserCommand implements ICommand{public function onCommand($name,$args){if($name!='addUser') return false;echo ("UserCommand handling 'addUser' ");return true;}}class MailCommand implements ICommand{public function onCommand($name,$args){if($name!='mail')return false;echo ("MailCommand handling 'mail'");return true;}}$cc = new CommandChain();$cc->addCommand(new UserCommand);$cc->addCommand(new MailCommand);$cc->runCommand('addUser',null);$cc->runCommand('mail',null);?>

5、策略模式

      例如如果你想使用不同的排序方式对程序搜索到的结果进行排序,策略模式是个不错的选择,你可以选择不同的排序策略吐舌头

    

     举例如下:

     

<?phpinterface IStrategy{function filter($record);}class FindAfterStrategy implements IStrategy{private $_name;public function __construct($name){ $this->_name = $name;}public function filter($record){return strcmp($this->_name,$record)<=0;}}class RandomStrategy implements Istrategy{public function filter($record){return rand(0,1)>=0.5;}}class UserList{private $_list;public function __construct($names){if($names!=null){foreach($names as $name){ $this->_list[]=$name;}}}public function add($name){$this->_list[]=name;}public function find($filter){$recs = array();foreach($this->_list as $user){if($filter->filter($user)){$recs[]=$user;}}return $recs;}}$ul = new UserList(array("Andy","Jack","Lori","Megan"));$f1 = $ul->find(new FindAfterStrategy("J"));echo "f1";var_dump($f1);echo "<br>";$f2 = $ul->find(new RandomStrategy());echo "f2<br>";var_dump($f2);?>

 

看到啦,在上面这个例子中程序选用了策略一排序方式:  

strcmp($this->_name,$record)<=0;
或者策略二排序方式:

return rand(0,1)>=0.5;



好啦,写完啦,上面是我学习php常用设计模式的笔记

参考了php手册和Jack D Herrington 的《五种常见的 PHP 设计模式》,在这里非常感谢微笑

   


 




    


  


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 摩托车脱审4年怎么办 摩托车8年没年检怎么办 摩托车4年没年检怎么办 38度5算高烧吗怎么办 刚发现怀孕不想要怎么办 被蜥蜴咬出血了怎么办 去韩国打工签证怎么办多么钱 厕所堵了怎么办有妙招 蹲式厕所老是堵怎么办 下蹲式厕所堵了怎么办 蹲的厕所堵住了怎么办 厕所通了又堵怎么办 蹲式厕所经常堵怎么办 厕所下水管堵了怎么办 厕所堵了水满了怎么办 拉屎把厕所堵了怎么办 厕所堵了不下水怎么办 坐厕所堵了怎么办妙招 火车上丢了东西怎么办 网购的东西丢了怎么办 在酒店丢了东西怎么办 我好懒不想工作怎么办 被宠物刺猬咬了怎么办 被老鼠咬了怎么办打针 手指被老鼠咬了怎么办 孕妇被老鼠咬了怎么办 耳朵里面一直嗡嗡响怎么办 把语言栏删了怎么办 乐视会员到期了怎么办 预提费用取消了怎么办 小学生上课注意力不集中怎么办 工商抽查到你了怎么办 拿到商调函后该怎么办 苹果7p掉水里了怎么办 苹果7屏幕进水了怎么办 苹果5s掉进水里怎么办 苹果5s无法开机怎么办 苹果手机充不了电怎么办 苹果5s掉了怎么办 苹果6手机掉水里了怎么办 苹果5s关机丢了怎么办