php设计模式专题附源码(适配器模式、模板模式、命令模式、单例模式、观察者模式)

[php]  view plain  copy
 print ?
  1. /** 
  2.  *适配器模式* 
  3.  *将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作*/  
  4. //这个是原有的类型  
  5. class OldCache{  
  6.     public function __construct()  
  7.     {  
  8.         echo "Old Cache construct
    "
    ;  
  9.     }  
  10.     public function store($key$value)  
  11.     {  
  12.         echo "Old Cache store
    "
    ;  
  13.     }  
  14.     public function remove($key)  
  15.     {  
  16.         echo "Old Cache remove
    "
    ;  
  17.     }  
  18.     public function fetch($key)  
  19.     {  
  20.         echo "Old Cache fetch
    "
    ;  
  21.     }  
  22. }  
  23. interface Cacheable  
  24. {  
  25.     public function set($key$value);  
  26.     public function get($key);  
  27.     public function del($key);  
  28. }  
  29. class OldCacheAdapter implements Cacheable  
  30. {  
  31.     private $_cache = null;  
  32.   
  33.     public function __construct()  
  34.     {  
  35.         $this->_cache = new OldCache();  
  36.     }  
  37.     public function set($key$value)  
  38.     {  
  39.         return $this->_cache->store($key$value);  
  40.     }  
  41.     public function get($key)  
  42.     {  
  43.         return $this->_cache->fetch($key);  
  44.     }  
  45.     public function del($key)  
  46.     {  
  47.         return $this->_cache->remove($key);  
  48.     }  
  49. }  
  50. $objCache = new OldCacheAdapter();  
  51. $objCache->set("test", 1);  
  52. $objCache->get("test");  
  53. $objCache->del("test", 1);  


[php]  view plain  copy
 print ?
  1. /** 
  2.  *模板模式* 
  3.  *定义一个操作中的算法骨架,而将一些步骤延迟到子类中, 
  4.  * 使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤**/  
  5.   
  6. abstract class TemplateBase  
  7. {  
  8.     public function Method1()  
  9.     {  
  10.         echo "abstract Method1
    "
    ;  
  11.     }  
  12.     public function Method2()  
  13.     {  
  14.         echo "abstract Method2
    "
    ;  
  15.     }  
  16.     public function Method3()  
  17.     {  
  18.         echo "abstract Method3
    "
    ;  
  19.     }  
  20.     public function doSomeThing()  
  21.     {  
  22.         $this->Method1();  
  23.         $this->Method2();  
  24.         $this->Method3();  
  25.     }  
  26. }  
  27. class TemplateObject extends TemplateBase  
  28. {  
  29. }  
  30. class TemplateObject1 extends TemplateBase  
  31. {  
  32.     public function Method3()  
  33.     {  
  34.         echo "Template Object1 Method3
    "
    ;  
  35.     }  
  36. }  
  37. class TemplateObject2 extends TemplateBase  
  38. {  
  39.     public function Method2()  
  40.     {  
  41.         echo "Template Object2 Method2
    "
    ;  
  42.     }  
  43. }  
  44. //实例化  
  45. $objTemplate = new TemplateObject();  
  46. $objTemplate1 = new TemplateObject1();  
  47. $objTemplate2 = new TemplateObject2();  
  48. $objTemplate->doSomeThing();  
  49. $objTemplate1->doSomeThing();  
  50. $objTemplate2->doSomeThing();  

[php]  view plain  copy
 print ?
  1. /** 
  2.  *命令模式* 
  3.  *将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化, 
  4.  * 对请求排除或记录请求日志,以及支持可取消的操作*/  
  5. interface Command  
  6. {  
  7.     public function execute();  
  8. }  
  9. class Invoker  
  10. {  
  11.     private $_command = array();  
  12.     public function setCommand($command)  
  13.     {  
  14.         $this->_command[] = $command;  
  15.     }  
  16.     public function executeCommand()  
  17.     {  
  18.         foreach ($this->_command as $command) {  
  19.             $command->execute();  
  20.         }  
  21.     }  
  22.     public function removeCommand($command)  
  23.     {  
  24.         $key = array_search($command$this->_command);  
  25.         if ($key !== false) {  
  26.             unset($this->_command[$key]);  
  27.         }  
  28.     }  
  29. }  
  30. class Receiver  
  31. {  
  32.     private $_name = null;  
  33.   
  34.     public function __construct($name)  
  35.     {  
  36.         $this->_name = $name;  
  37.     }  
  38.     public function action()  
  39.     {  
  40.         echo $this->_name . "action
    "
    ;  
  41.     }  
  42.     public function action1()  
  43.     {  
  44.         echo $this->_name . "action1
    "
    ;  
  45.     }  
  46. }  
  47. class ConcreteCommand implements Command  
  48. {  
  49.     private $_receiver;  
  50.     public function __construct($receiver)  
  51.     {  
  52.         $this->_receiver = $receiver;  
  53.     }  
  54.     public function execute()  
  55.     {  
  56.         $this->_receiver->action();  
  57.     }  
  58. }  
  59. class ConcreteCommand1 implements Command  
  60. {  
  61.     private $_receiver;  
  62.     public function __construct($receiver)  
  63.     {  
  64.         $this->_receiver = $receiver;  
  65.     }  
  66.     public function execute()  
  67.     {  
  68.         $this->_receiver->action1();  
  69.     }  
  70. }  
  71. class ConcreteCommand2 implements Command  
  72. {  
  73.     private $_receiver;  
  74.     public function __construct($receiver)  
  75.     {  
  76.         $this->_receiver = $receiver;  
  77.     }  
  78.     public function execute()  
  79.     {  
  80.         $this->_receiver->action();  
  81.         $this->_receiver->action1();  
  82.     }  
  83. }  
  84. $objRecevier = new Receiver("No.1");  
  85. $objRecevier1 = new Receiver("No.2");  
  86. $objRecevier2 = new Receiver("No.3");  
  87. $objCommand = new ConcreteCommand($objRecevier);  
  88. $objCommand1 = new ConcreteCommand1($objRecevier);  
  89. $objCommand2 = new ConcreteCommand($objRecevier1);  
  90. $objCommand3 = new ConcreteCommand1($objRecevier1);  
  91. $objCommand4 = new ConcreteCommand2($objRecevier2); //使用Recevier的两个方法  
  92. $objInvoker = new Invoker();  
  93. $objInvoker->setCommand($objCommand);  
  94. $objInvoker->setCommand($objCommand1);  
  95. $objInvoker->executeCommand();  
  96. $objInvoker->removeCommand($objCommand1);  
  97. $objInvoker->executeCommand();  
  98. $objInvoker->setCommand($objCommand2);  
  99. $objInvoker->setCommand($objCommand3);  

[php]  view plain  copy
 print ?
  1. /** 
  2.  *单例模式* 
  3.  *保证一个类仅有一个实例,并提供一个访问它的全局访问点 
  4.  **/  
  5. class Singleton  
  6. {  
  7.     static private $_instance = null;  
  8.     private function __construct()  
  9.     {  
  10.   
  11.     }  
  12.     static public function getInstance()  
  13.     {  
  14.         if (is_null(self::$_instance)) {  
  15.             self::$_instance = new Singleton();  
  16.         }  
  17.         return self::$_instance;  
  18.     }  
  19.     public function display()  
  20.     {  
  21.         echo "it is a singlton class function";  
  22.     }  
  23. }  
  24. //$obj=new Singleton();  
  25. //声明不能成功$obj=Singleton::getInstance();var_dump($obj);$obj->display();  
  26. $obj1 = Singleton::getInstance();  

[php]  view plain  copy
 print ?
  1. /** 
  2.  *观察者模式* 
  3.  *定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新 
  4.  *能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能 
  5.  *插件系统*/  
  6. class Observerable  
  7. {  
  8.     private $_observers = array();  
  9.       
  10.     public function registerObserver($observer)  
  11.     {  
  12.         $this->_observers[] = $observer;  
  13.     }  
  14.     public function removeObserver($observer)  
  15.     {  
  16.         $key = array_search($observer$this->_observers);  
  17.         if (!($key === false)) {  
  18.             unset($this->_observers[$key]);  
  19.         }  
  20.     }  
  21.     public function notifyObservers()  
  22.     {  
  23.         foreach ($this->_observers as $observer) {  
  24.             if ($observer instanceof Observer)  
  25.                 $observer->update($this);  
  26.         }  
  27.     }  
  28. }  
  29. interface Observer  
  30. {  
  31.     public function update($observer);  
  32. }  
  33. interface DisplayElement  
  34. {  
  35.     public function display();  
  36. }  
  37. //--实例类定义  
  38. class NewsObserverable extends Observerable  
  39. {  
  40.     private $_sports_news;  
  41.     public function setSportsNews($data)  
  42.     {  
  43.         $this->_sports_news = $data;  
  44.         $this->notifyObservers();  
  45.     }  
  46.     public function getSportsNews()  
  47.     {  
  48.         return $this->_sports_news;  
  49.     }  
  50.     private $_local_news;  
  51.     public function setLocalNews($data)  
  52.     {  
  53.         $this->_local_news = $data;  
  54.         $this->notifyObservers();  
  55.     }  
  56.     public function getLocalNews()  
  57.     {  
  58.         return $this->_local_news;  
  59.     }  
  60. }  
  61. class SportsNews implements Observer, DisplayElement  
  62. {  
  63.     private $_data = null;  
  64.     public function update($observer)  
  65.     {  
  66.         if ($this->_data != $observer->getSportsNews()) {  
  67.             $this->_data = $observer->getSportsNews();  
  68.             $this->display();  
  69.         }  
  70.     }  
  71.     public function display()  
  72.     {  
  73.         echo $this->_data . date("Y-m-d H:i:s") . "
    "
    ;  
  74.     }  
  75. }  
  76. class LocalNews implements Observer, DisplayElement  
  77. {  
  78.     private $_data = null;  
  79.     public function update($observer)  
  80.     {  
  81.         if ($this->_data != $observer->getLocalNews()) {  
  82.             $this->_data = $observer->getLocalNews();  
  83.             $this->display();  
  84.         }  
  85.     }  
  86.     public function display()  
  87.     {  
  88.         echo $this->_data . date("Y-m-d H:i:s") . "
    "
    ;  
  89.     }  
  90. }  
  91. //--实例化---  
  92. $objObserver = new NewsObserverable();  
  93. $local = new LocalNews();  
  94. $sports = new SportsNews();  
  95. $objObserver->registerObserver($local);  
  96. $objObserver->registerObserver($sports);  
  97. $objObserver->setSportsNews("sportsnews1");  
  98. $objObserver->setLocalNews("localnews1");  
  99. $objObserver->removeObserver($sports);  
  100. $objObserver->setLocalNews("localnews2");  
  101. $objObserver->setSportsNews("sportsnews2");  
  102. $objObserver->removeObserver($local);  
  103. $objObserver->setLocalNews("localnews3");  

你可能感兴趣的:(php设计模式专题附源码(适配器模式、模板模式、命令模式、单例模式、观察者模式))