设计模式二
最近在写代码的时候老是感觉那里不对劲,觉得整体代码还是不够完善,所以开始研究起设计模式。一切以代码样例说话
单件模式在上次说过,具体看 http://rtxbc.iteye.com/blog/867500
策略模式
<?php/** *策略模式 *实现方式:一个抽象的拥有一个算法方法的基类;继承这个基类的具体的类来实现 *策略模式经常跟工厂模式一起使用 */abstract class fileName{ abstract function createLinkName($filename);}class zipFileName extends fileName{ function createLinkName($filename){ return 'http://www.foo.com/'.$filename.'.zip'; } }class tarFilename extends fileName{ function createLinkName($filename){ return 'http://www.foo.com/'.$filename.'.tar'; } }// 使用if(strstr($_SERVER['HTTP_USER_AGENT'],'Win')){ $filename = new zipFileName();}else{ $filename = new tarFileName();}echo $filename->createLinkName('ok');
工厂模式&&策略模式
<?php/** *工厂模式 *实现方式:工厂类拥有一个静态的方法(用于接收一些输入,并根据输入决定应该创建哪个类的实例-通常是一个子类) *下面实例是策略模式和工厂模式的综合使用 */abstract class User{ protected $_name=NULL; function __construct($name){ $this->_name = $name; } // 权限方法 abstract function hasModifyPermission();}class GuestUser extends User{ function hasModifyPermission(){ return false; }}class adminUser extends User{ function hasModifyPermission(){ return true; }}// 工厂模式class UserFactory{ static function create($name){ switch($name){ case 'guest': return new GuestUser($name); case 'admin': return new adminUser($name); default:; } }}var_dump(UserFactory::create('guest')->hasModifyPermission()); // output false var_dump(UserFactory::create('admin')->hasModifyPermission()); // output true
观察者模式(需要好好理解)
<?php/** *观察者模式 *实现方式:通过一个观察者observer接口来实现,对作为观察者感兴趣的类需要实现这个接口 * * 一个对象想要"可观察",通常需要一个注册方法,这让观察这对象可以注册它自己 * */interface observer{ function notify($obj);}class exchange{ static function getInstance(){ static $instance = NULL; if($instance === NULL){ $instance = new self(); } return $instance; } private $_observers = array(); public $_rate=1.0; function setChange($rate){ $this->_rate = $rate; $this->notifyObservers(); } function registerObserver($obj){ $this->_observers[] = $obj; } function notifyObservers(){ foreach($this->_observers as $obj){ $obj->notify($this); } } }class product implements observer{ function __construct(){ exchange::getInstance()->registerObserver($this); } function notify($obj){ if($obj instanceof exchange){ echo $obj->_rate," Update!\n"; } }}$p1 = new product();$p2 = new product();exchange::getInstance()->setChange(4.5);/* *分析: $p1,$p2 注册到exchange对象里,当exchange更新时,会通知(notify())$p1和$p2 */
页:
[1]