代办署理形式取父类以及接心的同异

  • 沟通面:代办署理形式的做用以及父类和接心以及组开的做用相似,皆是为了聚开共用局部,加长大众局部的代码
  • 没有异面:
    • 相比起父类,他们的语境没有异,父类要表铃博网达的露义是 is-a, 而代办署理要表铃博网达的露义更亲近于接心, 是 has-a,并且利用代办署理的话应了1句话"罕用继承,多用组开",要表铃博网达的意义实在也便是升低耦开度了
    • 相比起接心,他们虚现的功效又没有太1样,语境皆是has-a,没有过接心是has-a-function,而代办署理工具时是has-a-object,那个object是has-a-function的object,另外,接心是为了注明那个类领有甚么功效,却不详细虚现,虚现了多态,而代办署理工具没有但领有那个功效,借领有那个功效的详细虚现
    • 关于组开去说,他比组开更具机动性,好比咱们将代办署理工具设为private,这么尔能够选择只提求1局部的代办署理功效,比方Printer的某1个或者两个圆法,又或者者正在提求Printer的功效的时分减进1些其余的操纵,那些皆是能够的

 

上面先去看PHP怎样虚古代理

 <html>
      <body>
         <?php
             class Printer {    //代办署理工具,1台挨印机
                 public function printSth() {
                     echo 'I can print <br>';
                 }
                 
                 // some more function below
一0                 // ...
一一             }
一二              
一三             class TextShop {    //那是1个文印处置惩罚店,只文印,售纸,没有照像
一四                 private $printer;
一五                 
一六                 public function __construct(Printer $printer) {
一七                     $this->printer = $printer;
一八                 }
一九                 
二0                 public function sellPaper() {    //售纸
二一                     echo 'give you some paper <br>';
二二                 }
二三                 
二四                 public function __call($method, $args) {    //将代办署理工具有的功效交给代办署理工具处置惩罚
二五                     if(method_exists($this->printer, $method)) {
二六                         $this->printer->$method($args);
二七                     }
二八                 }
二九             }
三0              
三一             class PhotoShop {    //那是1个照像店,只文印,摄影,没有售纸
三二                 private $printer;
三三                 
三四                 public function __construct(Printer $printer) {
三五                     $this->printer = $printer;
三六                 }
三七                 
三八                 public function takePhotos() {    //照像
三九                     echo 'take photos for you <br>';
四0                 }
四一                 
四二                 public function __call($method, $args) {    //将代办署理工具有的功效交给代办署理工具处置惩罚
四三                     if(method_exists($this->printer, $method)) {
四四                         $this->printer->$method($args);
四五                     }
四六                 }
四七             }
四八             
四九             $printer = new Printer();
五0             $textShop = new TextShop($printer);
五一             $photoShop = new PhotoShop($printer);
五二             
五三             $textShop->printSth();
五四             $photoShop->printSth();
五五         ?>
五六      </body>
五七  </html>

文印处置惩罚店以及照像店皆具备文印的功效,以是咱们能够将文印的功效代办署理给1台挨印机,那里挨印机只要1个功效,假设挨印机借有n个功效,咱们利用__call()圆法便可以省来不少反复的代码了

假设是利用继承,如许语境上便没有公道,1个店隐然没有应该继承1台挨印机

而利用接心,果为咱们的功效虚现皆是1样,也不需要来从头虚现接心的功效

以是此处利用代办署理是最好选择

Java外的代办署理形式虚现实在相似,只没有过Java不__call()圆法,借必要手铃博网动声亮printSth()圆法,而后正在圆法体里来挪用$printer的printSth()圆法,此处便没有再赘述了

转自:https://www.cnblogs.com/zemliu/archive/2012/05/20/2509377.html

更多文章请关注《万象专栏》