当前位置:首页 > PHP教程 > php面向对象 > 列表

深入分析PHP设计模式

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-14 16:08:16 浏览: 评论:0 

这篇文章主要介绍了PHP设计模式的相关知识,文中讲解非常细致,代码帮助大家更好的理解学习,感兴趣的朋友可以参考下。

1、单例模式

一个类,只能允许有一个对象存在

  1. <?php 
  2. class test{ 
  3.   protected function __construct(){ 
  4.   } 
  5.  
  6.   public static function getInstance(){ 
  7.     $_test = new test(); 
  8.     return $_test
  9.   } 
  10. $test = test::getInstance(); 
  11. var_dump($test); 
  12. ?> 

2、工厂模式

工厂模式,顾名思义,如同工厂一样,你把原材料放入工厂中,出来的是成品,而你并不需要知道工厂里做了什么,工厂模式主要用于解耦。

把对象的创建和使用的过程分开,比如: ClassA 调用 ClassB,那么 ClassA 只调用ClassB 的方法,至于实例化 ClassB 则在工厂内实现。这样既减少了代码的重复使用,也方便对 ClassB 的后期维护。

如果 ClassB 实例化过程很复杂,使用简单工厂模式就会发现外部无需关注复杂的实例化,只管调用 ClassB 的方法即可,减少错误

  1. interface mysql{  
  2.   public function connect(); 
  3.    
  4. class mysqli2 implements mysql{ 
  5.   public function connect(){ 
  6.     echo 'mysqli'
  7.   } 
  8.    
  9. class pdo2 implements mysql{ 
  10.   public function connect(){ 
  11.     echo 'pdo'
  12.   } 
  13.  
  14. class mysqlFactory{ 
  15.   static public function factory($class_name){ 
  16.     return new $class_name(); 
  17.   } 
  18. $obj = mysqlFactory::factory('pdo2'); 
  19. $obj->connect(); 

3、注册模式

注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。

  1. <?php 
  2. class Register 
  3.     protected static $objects
  4.     function set($alias,$object)//将对象注册到全局的树上 
  5.     { 
  6.       self::$objects[$alias]=$object;//将对象放到树上 
  7.     } 
  8.     static function get($name){ 
  9.       return self::$objects[$name];//获取某个注册到树上的对象 
  10.      } 
  11.   function _unset($alias
  12.   { 
  13.      unset(self::$objects[$alias]);//移除某个注册到树上的对象。 
  14.     } 
  15.  
  16. \Auto\Register::set('single',$single); 
  17. $single = \Auto\Register::get('single'); 
  18. var_dump($single); 

4、适配器模式

将一个类的接口转换成客户希望的另外一个接口。

  1. //目标角色 
  2. interface Aims 
  3.   public function newMethod1(); 
  4.   public function newMethod2(); 
  5.    
  6. //需要被适配的类(Adaptee) 
  7. Class Man 
  8.   public function oldMethod1() 
  9.   { 
  10.     echo 'man'
  11.   } 
  12.    
  13.   public function oldMethod2() 
  14.   { 
  15.     echo '男人'
  16.   } 
  17.    
  18. //需要被适配的类(Adaptee) 
  19. Class Woman 
  20.   public function oldMethod1() 
  21.   { 
  22.     echo 'woman'
  23.   } 
  24.    
  25.   public function oldMethod2() 
  26.   { 
  27.     echo '女人'
  28.   } 
  29.    
  30. //适配器, 
  31. Class Adapters implements Aims 
  32.   private $adaptee
  33.   public function __construct($adaptee
  34.   { 
  35.     $this->adaptee = $adaptee
  36.   } 
  37.    
  38.   public function newMethod1() 
  39.   { 
  40.     //以少量的代码对被适配者作出适配 
  41.     echo 'sex :'
  42.     $this->adaptee->oldMethod1(); 
  43.   } 
  44.    
  45.   public function newMethod2() 
  46.   { 
  47.     echo 'sex name :'
  48.     $this->adaptee->oldMethod2(); 
  49.   } 
  50.    
  51. $adapter1 = new Adapters(new Man); 
  52. $adapter1->newMethod1(); 
  53. $adapter2 = new Adapters(new Woman); 
  54. $adapter2->newMethod2(); 

5、策略模式

这是一个男人和女人的问题,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。

UserStrategy.php

  1. <?php 
  2. /* 
  3.  * 声明策略文件的接口,约定策略包含的行为。 
  4.  */ 
  5. interface UserStrategy 
  6.   function showAd(); 
  7.   function showCategory(); 
  8.  
  9. FemaleUser.php 
  10. <?php 
  11. class FemaleUser implements UserStrategy 
  12.   function showAd(){ 
  13.     echo "2016冬季女装"
  14.   } 
  15.   function showCategory(){ 
  16.     echo "女装"
  17.   } 
  18.  
  19. MaleUser.php 
  20. <?php 
  21. class MaleUser implements UserStrategy 
  22.   function showAd(){ 
  23.     echo "IPhone6s"
  24.   } 
  25.   function showCategory(){ 
  26.     echo "电子产品"
  27.   } 
  28.  
  29. Page.php//执行文件 
  30. <?php 
  31. require_once 'Loader.php'
  32. class Page 
  33.   protected $strategy
  34.   function index(){ 
  35.     echo "AD"
  36.     $this->strategy->showAd(); 
  37.     echo "<br>"
  38.     echo "Category"
  39.     $this->strategy->showCategory(); 
  40.     echo "<br>"
  41.   } 
  42.   function setStrategy(UserStrategy $strategy){ 
  43.     $this->strategy=$strategy
  44.   } 
  45.  
  46. $page = new Page(); 
  47. if(isset($_GET['male'])){ 
  48.   $strategy = new MaleUser(); 
  49. }else { 
  50.   $strategy = new FemaleUser(); 
  51. $page->setStrategy($strategy); 
  52. $page->index(); 

6、原型模式

不常用,大的对象类才使用,表现在clone

7、观察者模式

从面向过程的角度来看,首先是观察者向主题注册,注册完之后,主题再通知观察者做出相应的操作,整个事情就完了。

  1. /** 
  2.  * 事件产生类 
  3.  * Class EventGenerator 
  4.  */ 
  5. abstract class EventGenerator 
  6.   private $ObServers = []; 
  7.  
  8.   //增加观察者 
  9.   public function add(ObServer $ObServer
  10.   { 
  11.     $this->ObServers[] = $ObServer
  12.   } 
  13.  
  14.   //事件通知 
  15.   public function notify() 
  16.   { 
  17.     foreach ($this->ObServers as $ObServer) { 
  18.       $ObServer->update(); 
  19.     } 
  20.   } 
  21.  
  22.  
  23. /** 
  24.  * 观察者接口类 
  25.  * Interface ObServer 
  26.  */ 
  27. interface ObServer 
  28.   public function update($event_info = null); 
  29.  
  30. /** 
  31.  * 观察者1 
  32.  */ 
  33. class ObServer1 implements ObServer 
  34.   public function update($event_info = null) 
  35.   { 
  36.     echo "观察者1 收到执行通知 执行完毕!\n"
  37.   } 
  38.  
  39. /** 
  40.  * 观察者1 
  41.  */ 
  42. class ObServer2 implements ObServer 
  43.   public function update($event_info = null) 
  44.   { 
  45.     echo "观察者2 收到执行通知 执行完毕!\n"
  46.   } 
  47.  
  48. /** 
  49.  * 事件 
  50.  * Class Event 
  51.  */ 
  52. class Event extends EventGenerator 
  53.   /** 
  54.    * 触发事件 
  55.    */ 
  56.   public function trigger() 
  57.   { 
  58.     //通知观察者 
  59.     $this->notify(); 
  60.   } 
  61.  
  62. //创建一个事件 
  63. $event = new Event(); 
  64. //为事件增加旁观者 
  65. $event->add(new ObServer1()); 
  66. $event->add(new ObServer2()); 
  67. //执行事件 通知旁观者 
  68. $event->trigger(); 

Tags: PHP设计模式

分享到: