rtxbc 发表于 2013-1-28 09:49:58

设计模式二

    最近在写代码的时候老是感觉那里不对劲,觉得整体代码还是不够完善,所以开始研究起设计模式。
一切以代码样例说话
 
单件模式在上次说过,具体看 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]
查看完整版本: 设计模式二