若转载教程,请注明出自SW-X框架官方文档

  1. <?php
  2. /**
  3. * 设计模式之代理器模式
  4. * 我的理解:对对象进行了控制
  5. * 小黄牛
  6. */
  7. header("Content-type: text/html; charset=utf-8");
  8. /**
  9. * 接口 - 鞋
  10. */
  11. interface ShoesInterface{
  12. public function product();
  13. }
  14. /**
  15. * 创建 - 运动鞋模型
  16. */
  17. class ShoesSport implements ShoesInterface{
  18. public function product(){
  19. echo "生产一双球鞋<br/>";
  20. }
  21. }
  22. /**
  23. * 代理器
  24. */
  25. class Proxy{
  26. private $_shoes; // 鞋的模型对象
  27. private $_shoesType; // 生产哪种鞋子
  28. public function __construct($shoesType){$this->_shoesType = $shoesType;}
  29. /**
  30. * 生产.
  31. */
  32. public function product(){
  33. switch ($this->_shoesType) {
  34. case 'sport':
  35. echo "我可以偷工减料";
  36. $this->_shoes = new ShoesSport();
  37. break;
  38. default:
  39. throw new Exception("类型不正确", 404);
  40. break;
  41. }
  42. $this->_shoes->product();
  43. }
  44. }
  45. echo "未加代理之前:<br/>";
  46. # 生产运动鞋
  47. $shoesSport = new ShoesSport();
  48. $shoesSport->product();
  49. echo "加代理:<br/>";
  50. # 把运动鞋产品线外包给代工厂
  51. $proxy = new Proxy('sport');
  52. # 代工厂生产运动鞋
  53. $proxy->product();

浏览器输出

  1. 未加代理之前:
  2. 生产一双球鞋
  3. 加代理:
  4. 我可以偷工减料生产一双球鞋

代理器模式

  1. 抽象主题角色(IGiveGift):定义了FollowerProxy公用接口,这样就在任何使用Follower的地方都可以使用Proxy
  2. 主题角色(Follower):定义了Proxy所代表的真实实体。
  3. 代理对象(Proxy):保存一个引用使得代理可以访问实体,并提供一个与Follower接口相同的接口,这样代理可以用来代替实体(Follower)。

三者之间的区别

  1. 代理器:对对象加以【控制接口】
  2. 适配器的区别:适配器是连接两个接口(【改变接口】)
  3. 装饰器的区别:装饰器是对现有的对象包装(【接口的功能扩展】)

免费教程手写不易,希望能支持一下SW-X框架,(^.^)

GitHub有账号的朋友,也可以给我们一个小星星噢!

希望能够与大家共同培育出良好的Swoole生态,对Swoole有兴趣的朋友可以加我微信好友,进入SW-X框架官方交流群。
该群以Swoole生态发展交流为主,若出现争吵,攻击其他人等行为,立即剔除。