博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP的代理模式
阅读量:6300 次
发布时间:2019-06-22

本文共 2540 字,大约阅读时间需要 8 分钟。

代理模式与父类和接口的异同

  • 相同点:代理模式的作用和父类以及接口和组合的作用类似,都是为了聚合共用部分,减少公共部分的代码
  • 不同点:
    • 相比起父类,他们的语境不同,父类要表达的含义是 is-a, 而代理要表达的含义更接近于接口, 是 has-a,而且使用代理的话应了一句话"少用继承,多用组合",要表达的意思其实也就是降低耦合度了
    • 相比起接口,他们实现的功能又不太一样,语境都是has-a,不过接口是has-a-function,而代理对象时是has-a-object,这个object是has-a-function的object,此外,接口是为了说明这个类拥有什么功能,却没有具体实现,实现了多态,而代理对象不但拥有这个功能,还拥有这个功能的具体实现
    • 对于组合来说,他比组合更具灵活性,比如我们将代理对象设为private,那么我可以选择只提供一部分的代理功能,例如Printer的某一个或两个方法,又或者在提供Printer的功能的时候加入一些其他的操作,这些都是可以的

 

下面先来看PHP如何实现代理

1  2       3         
'; 7 } 8 9 // some more function below10 // ...11 }12 13 class TextShop { //这是一个文印处理店,只文印,卖纸,不照相14 private $printer;15 16 public function __construct(Printer $printer) {17 $this->printer = $printer;18 }19 20 public function sellPaper() { //卖纸21 echo 'give you some paper
';22 }23 24 public function __call($method, $args) { //将代理对象有的功能交给代理对象处理25 if(method_exists($this->printer, $method)) {26 $this->printer->$method($args);27 }28 }29 }30 31 class PhotoShop { //这是一个照相店,只文印,拍照,不卖纸32 private $printer;33 34 public function __construct(Printer $printer) {35 $this->printer = $printer;36 }37 38 public function takePhotos() { //照相39 echo 'take photos for you
';40 }41 42 public function __call($method, $args) { //将代理对象有的功能交给代理对象处理43 if(method_exists($this->printer, $method)) {44 $this->printer->$method($args);45 }46 }47 }48 49 $printer = new Printer();50 $textShop = new TextShop($printer);51 $photoShop = new PhotoShop($printer);52 53 $textShop->printSth();54 $photoShop->printSth();55 ?>56 57

文印处理店和照相店都具有文印的功能,所以我们可以将文印的功能代理给一台打印机,这里打印机只有一个功能,假如打印机还有n个功能,我们使用__call()方法就能够省去很多重复的代码了

假如是使用继承,这样语境上就不合理,一个店显然不应该继承一台打印机

而使用接口,因为我们的功能实现都是一样,也没有必要去重新实现接口的功能

所以此处使用代理是最佳选择

Java中的代理模式实现其实类似,只不过Java没有__call()方法,还需要手动声明printSth()方法,然后在方法体里去调用$printer的printSth()方法,此处就不再赘述了

转载地址:http://cagta.baihongyu.com/

你可能感兴趣的文章
Python回顾与整理1:Python基础
查看>>
.net精简框架集多个类同时串行化(XML方式)技术
查看>>
C#中的 int?是什么意思
查看>>
编程思维随想
查看>>
微信小程序+java后端整合笔记
查看>>
Java应用程序工程模板
查看>>
Web上传文件的原理及实现
查看>>
DPM2007安装配置简要指南
查看>>
如何使用常用的6种方式对数据进行转换(二)
查看>>
1463: C语言实验题――相加和最大值
查看>>
坚持之随想
查看>>
$.ajax()方法详解
查看>>
python模块介绍- SocketServer 网络服务框架
查看>>
【CSS进阶】box-shadow 与 filter:drop-shadow 详解及奇技淫巧
查看>>
IE无法显示.shtml格式网页
查看>>
Android 发送多个不同的快捷方式(shortcut)到桌面并向其启动的Activity传参
查看>>
Lind.DDD.ILogicDeleteBehavor~逻辑删除的实现
查看>>
从零开始仿写一个BiliBili客户端之编译ijkplayer
查看>>
略谈OS存储管理
查看>>
lamp组合详解
查看>>