经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
PHP设计模式之代理模式
来源:cnblogs  作者:硬核项目经理  时间:2020/12/28 9:56:40  对本文有异议

代理人这个职业在中国有另外一个称呼,房产经济人、保险经济人,其实这个职业在国外都是叫做房产代理或者保险代理。顾名思义,就是由他们来帮我们处理这些对我们大部分人来说都比较生疏的专业领域的工作。代理模式也是一样的道理,同时,在这篇文章中还会简单的介绍正向代理和反向代理是怎么回事。

Gof类图及解释

GoF定义:为其它对象提供一种代理以控制对这个对象的访问

GoF类图

代理模式

代码实现

  1. interface Subject
  2. {
  3. public function Request();
  4. }
  5. class RealSubject implements Subject
  6. {
  7. function Request()
  8. {
  9. echo "真实的操作", PHP_EOL;
  10. }
  11. }
  12. class Proxy implements Subject
  13. {
  14. private $realSubject;
  15. public function __construct()
  16. {
  17. $this->realSubject = new RealSubject();
  18. }
  19. public function Request()
  20. {
  21. echo "代理的操作", PHP_EOL;
  22. $this->realSubject->Request();
  23. }
  24. }
  25. $proxy = new Proxy();
  26. $proxy->Request();
  • 代理模式的实现其实非常简单,或许你在不经意间经常会用到
  • 请注意代理模式与装饰器、适配器的区别,另外,模板方法模式也和它很像
  • 装饰器,一般是对对象进行装饰,其中的方法行为会有增加,以修饰对象为主
  • 适配器,一般会改变方法行为,目的是保持接口的统一但得到不同的实现
  • 模板方法模式,我们后面会讲,这里只要知道,模板方法是在抽象类中去组合调用子类的方法
  • 代理模式有几种形式:远程代理(例如:第三方接口SDK)、虚代理(例如:异步加载图片)、保护代理&智能指引(例如:权限保护),而我们代码实现的最普通的代理,其实就是让代理类来代替真实类的操作

**

完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/12.proxy/source/proxy.php

实例

短信功能不能停,这回用简单的代理模式来增加一些前后的提示吧!

短信发送类图

短信发送代理模式版

完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/12.proxy/source/proxy-msg.php

  1. <?php
  2. interface SendMessage
  3. {
  4. public function Send();
  5. }
  6. class RealSendMessage implements SendMessage
  7. {
  8. public function Send()
  9. {
  10. echo '短信发送中...', PHP_EOL;
  11. }
  12. }
  13. class ProxySendMessage implements SendMessage
  14. {
  15. private $realSendMessage;
  16. public function __construct($realSendMessage)
  17. {
  18. $this->realSendMessage = $realSendMessage;
  19. }
  20. public function Send()
  21. {
  22. echo '短信开始发送', PHP_EOL;
  23. $this->realSendMessage->Send();
  24. echo '短信结束发送', PHP_EOL;
  25. }
  26. }
  27. $sendMessage = new ProxySendMessage(new RealSendMessage());
  28. $sendMessage->Send();

说明

  • 例子非常简单,还是普通代理的实现,这里我们讲下正向代理和反向代理
  • 通常我们所说的(fanqiang),就是正向代理,由我们使用软件或者自己配置代理网关上网,实际就是我们把请求发送到指定的网关,再由这个网关代替我们去访问其他网站,这种由我们指定选择的代理就是正向代理
  • PHPer们大多还是比较清楚反向代理的,毕竟现在Nginx已经代替Apache成为了PHP标配了。当我们访问一个网站的时候,某些路径或者域名并不一定是在这台服务器上,他们在服务器上直接代理到了其他的服务器甚至是别人家的站点。对于这个我们这些浏览网站的人是不知道的,这种我们不知道就被莫名其妙代理了的情况就是反向代理,一般在服务后台运维中是必备知识!

下期看点

代理模式说简单也简单,说复杂的话也很复杂,总之还是根据业务形态来决定,模式真的只是为了解决问题而生的,问题能解决了,你也可以叫他经济人模式嘛,你说是不是!!下一篇我们一起学习享元模式,听着又很高大上吧!!

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

原文链接:http://www.cnblogs.com/zyblog-coder/p/14176884.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号