若转载教程,请注明出自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. 装饰器的区别:装饰器是对现有的对象包装(【接口的功能扩展】)