当前位置:首页 > PHP教程 > php高级应用 > 列表

什么是代理模式?(实例说明)

发布:smiling 来源: PHP粉丝网  添加日期:2020-02-17 19:22:04 浏览: 评论:0 

代理模式:代理模式的作用和继承以及接口和组合的作用类似,都是为了聚合共用部分,减少公共部分的代码。

不同的是相比起继承,他们的语境不同,继承要表达的含义是 is-a, 而代理要表达的含义更接近于接口, 是 has-a,而且使用代理的话应了一句话"少用继承,多用组合",要表达的意思其实也就是降低耦合度了。

对于组合来说,他比组合更具灵活性,比如我们将代理对象设为private,那么我可以选择只提供一部分的代理功能,例如Printer的某一个或两个方法,又或者在提供Printer的功能的时候加入一些其他的操作,这些都是可以的。

  1. <?php 
  2.  
  3. //代理对象,一台打印机 
  4.  
  5. class Printer {  
  6.  
  7.     public function printSth() { 
  8.  
  9.         echo '我可以打印<br>'
  10.  
  11.     } 
  12.  
  13.  
  14. //这是一个文印处理店,只文印,卖纸,不照相 
  15.  
  16. class TextShop { 
  17.  
  18.     private $printer
  19.  
  20.     public function __construct(Printer $printer) { 
  21.  
  22.         $this->printer = $printer
  23.  
  24.     } 
  25.  
  26.     //卖纸 
  27.  
  28.     public function sellPaper() { 
  29.  
  30.         echo 'give you some paper <br>'
  31.  
  32.     } 
  33.  
  34.     //将代理对象有的功能交给代理对象处理 
  35.  
  36.     public function __call($method$args) { 
  37.  
  38.         if(method_exists($this->printer, $method)) { 
  39.  
  40.             $this->printer->$method($args); 
  41.  
  42.         } 
  43.  
  44.     } 
  45.  
  46.  
  47. //这是一个照相店,只文印,拍照,不卖纸 
  48.  
  49. class PhotoShop {     
  50.  
  51.     private $printer
  52.  
  53.       
  54.  
  55.     public function __construct(Printer $printer) { 
  56.  
  57.         $this->printer = $printer
  58.  
  59.     } 
  60.  
  61.       
  62.  
  63.     public function takePhotos() {    //照相 
  64.  
  65.         echo 'take photos for you <br>'
  66.  
  67.     } 
  68.  
  69.       
  70.  
  71.     public function __call($method$args) {    //将代理对象有的功能交给代理对象处理 
  72.  
  73.         if(method_exists($this->printer, $method)) { 
  74.  
  75.             $this->printer->$method($args); 
  76.  
  77.         } 
  78.  
  79.     } 
  80.  
  81.  
  82. $printer = new Printer(); 
  83.  
  84. $textShop = new TextShop($printer); 
  85.  
  86. $photoShop = new PhotoShop($printer); 
  87.  
  88. $textShop->printSth(); 
  89.  
  90. $photoShop->printSth(); 

Tags: 什么是代理模式

分享到: