PHP 设计模式实例
设计模式实例:
Singleton(单例)表示类只能实例化一次,生成一个全局状态且单一的根对象 ,利用单例模式可以配置应用程序并定义应用程序中可能随时访问你的变量,缺点在于该对象没有封装任何系统功能,多数情况下使应用程序的单元测试和调试变得更加困难
1 <?php 2 class SingletonClass { 3 public static function getInstance(){ 4 static $instance = null; 5 if($instance == null){ 6 $instance = new SingletoClass(); 7 } 8 return $instance; 9 } 10 } 11 $singletion = SingletonClass::getInstance(); 12 ?>
Multiton(多例)表示类可以多次实例化,对于给定的关键值只会存在唯一的对象实力,这样做可以节省内存,同时确保同一个对象的多个实例不会发生冲突
<?php class MultitonClass { public static function getInstance($key){ static $instance = array() if(!array_key_exists($key,$instance)){ $instance[$key] = new MultitonClass(); } return $instance[$key]; } } $multion = MultitonClass::getInstance("cms"); ?>
Proxy(代理)表示所有的成员方法和变量都来源于目标类,代理模式能够对他所传递的数据进行修改和检查,也可用来记录访问信息,通过代理模式可以实现不同系统的接口调用
1 <?php 2 class ProxyClass { 3 private $target; 4 function __construct($target){ 5 $this->target=$target; 6 } 7 function __log($line){ 8 error_log($line); 9 } 10 function __set($name,$value){ 11 $this->target->$name; 12 $this->log("Setting value for $name:$value"); 13 } 14 function __get($name){ 15 $value=$this->target->$name; 16 $this->log("Getting value for $name:$value"); 17 return $value; 18 } 19 function __call($name,$arguments){ 20 $this->log("Calling method $name width:".impolde(",",$arguments)); 21 return call_user_func_array(array($this->target,$name),$arguments); 22 } 23 } 24 25 $object =new myClass(); 26 $proxy = ProxyClass($object); 27 $proxy->myname(); 28 ?>
Facade(外观) 抽象化复杂的功能,将子系统处理各请求的细节委托成合适的责任,这样使应用程序无需了解了解子系统的存在,子系统也不需要外观者的存在
1 <?php 2 class FacadeClass { 3 publice apiRequestJson($data){ 4 $verify = new Verify(); 5 if($verify->verifyData($data)){ 6 $result=$this->method($data); 7 return json_decode($result); 8 }9 } 10 } 11 ?>
Decorator(装饰者) 表示对象实例化后,可以通过多个装饰者类来扩展实例化对象
1 <?php 2 abstract class abstractCar{ 3 publice abstract function getPrice(){} 4 } 5 class Car extends abstractCar{ 6 private $price=16000; 7 publice function getPrice(){return $this->price;} 8 } 9 class CarDecorator extends abstractCar{ 10 private $target; 11 publice __constrauct(Car $target){$this->target=$target;} 12 publice function getPrice(){return $this->target->price;} 13 } 14 class writeColor extends CarDecorator{ 15 publice function getPrice (){return parent:: getPrice()+500;} 16 } 17 $car = new Car(); 18 $writeCar =new writeColor($car); 19 $writeCar->getPrice(); 20 ?>
Factory(工厂) 对象调用某一条件的方法时,工厂模式通过一定的判断条件来获取到子类的对象实例
1 <?php 2 abstract class Factory{ 3 public static function getFactory($type){ 4 swith($tyle){ 5 case 1 : return new userFartory();break; 6 case 2 : return new adminFartory();break; 7 } 8 } 9 } 10 class userFartory extends userFartory{} 11 class userFartory extends adminFartory{} 12 $userFactory= $factory::getFactory(1); 13 $adminFactory= $factory::getFactory(2); 14 ?>
Observer Pattern(观察者模式) 当发布者Publisher对象生成事件后,发布者立刻通知所有观察者,观察者必须掌握广播了它的监听事件的对象
1 <?php 2 interface Obsercer{ 3 publice function notify($event); 4 } 5 class ObservableObject{ 6 private $observers=array(); 7 publice function observer(Observer $observer){ 8 $this->observers[]=$observer; 9 } 10 publice function dispath($event){ 11 foreach ($this->observers as $observer){ 12 $observer->notify($event); 13 } 14 } 15 } 16 ?>
Publisher/subscriber(发布者/订阅者)当应用程序在何时何处触发时,观察者都将订阅到事件的通知,而不是仅观察到某个类所生成的事件,往往事件本身充当控制器
1 <?php 2 interface Obsercer{ 3 publice function notify($event); 4 } 5 class BroadcastingEvent{ 6 private static $observers=array(); 7 publice static function subscribe(Observer $observer){ 8 self::observers[]=$observer; 9 } 10 publice function publish(){ 11 foreach (self::observers as $observer){ 12 $observer->notify($this); 13 } 14 } 15 } 16 ?>