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()方法,以此来通知观察者。
命令链模式是通过一个对象发送消息、命令和请求。或者通过一组处理程序发送任意内容。每个处理程序都会自己判断自己能否处理请求。如果可以则进行处理。
举例程序:
<?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 设计模式》,在这里非常感谢
- php 设计模式(学习笔记)
- PHP设计模式学习笔记
- PHP中设计模式的学习笔记
- php设计模式学习
- PHP设计模式——适配器模式(研磨设计模式学习笔记)
- PHP设计模式——工厂方法模式(研磨设计模式学习笔记)
- 设计模式学习笔记
- 设计模式学习笔记
- 设计模式学习笔记
- 设计模式【学习笔记】
- 设计模式 学习笔记
- 设计模式学习笔记
- 设计模式学习笔记
- 设计模式学习笔记
- 设计模式学习笔记
- 设计模式学习笔记
- 设计模式学习笔记
- 设计模式学习笔记
- 随心所欲为网页加上自己的注释
- 在Amazon EC2主机上安装Zmodem协议传输工具lrzsz
- S3C2416支持DM9000驱动(Linux)
- 用SecureCRT来上传和下载数据
- android学习——spinner控件
- php 设计模式(学习笔记)
- Linux的timerfd分析
- 严蔚敏-- 顺序栈的代码实现
- Framebuffer原理、使用、测试系列文章,非常好的资料,大家一起学习
- pthread用法
- /proc文件系统
- 价格搜索JS‘
- {希尔排序、快速排序、动态数组、单链表、字符串转整型}大综合
- C# webform 消息框