免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1112 | 回复: 0
打印 上一主题 下一主题

PHP设计模式之装饰者模式,代码练习 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 09:48 |只看该作者 |倒序浏览
  1. <?php
  2. /**
  3. * 装饰者模式
  4. */

  5. /**
  6.  * 冰激凌抽象类
  7.  */
  8. abstract class ICE
  9. {
  10.     public abstract function getDescription();
  11.     public abstract function cost();
  12. }

  13. /**
  14.  * 牛奶冰激凌,售价17RMB
  15.  */
  16. class MilkIce extends ICE
  17. {
  18.     public $description = '纯牛奶制作的冰激凌';

  19.     public function getDescription()
  20.     {
  21.         return $this->description;
  22.     }

  23.     public function cost()
  24.     {
  25.         return 17;
  26.     }
  27. }

  28. /**
  29.  * 沙冰冰激凌,售价10RMB
  30.  */
  31. class SlushIce extends ICE
  32. {
  33.     public $description = '冰块制作的冰激凌';

  34.     public function getDescription()
  35.     {
  36.         return $this->description;
  37.     }

  38.     public function cost()
  39.     {
  40.         return 10;
  41.     }
  42. }

  43. /**
  44.  * 冰激凌调料抽象类
  45.  */
  46. abstract class CondimentIce extends ICE
  47. {
  48.     //public abstract function getDescription();
  49.     //public abstract function cost();
  50. }

  51. /**
  52.  * 加香菜口味,附加5RMB
  53.  */
  54. class Herb extends CondimentIce
  55. {
  56.     public $ice;
  57.     public $description;

  58.     public function __construct($ice)
  59.     {
  60.         $this->ice = $ice;
  61.         $this->description = '法国香草';
  62.     }

  63.     public function getDescription()
  64.     {
  65.         return $this->ice->getDescription() . ',' . $this->description;
  66.     }

  67.     public function cost()
  68.     {
  69.         return $this->ice->cost() + 5;
  70.     }
  71. }

  72. /**
  73.  * 加草莓口味,附加8RMB
  74.  */
  75. class Berries extends CondimentIce
  76. {
  77.     public $ice;
  78.     public $description;

  79.     public function __construct($ice)
  80.     {
  81.         $this->ice = $ice;
  82.         $this->description = '野草莓';
  83.     }

  84.     public function getDescription()
  85.     {
  86.         return $this->ice->getDescription() . ',' . $this->description;
  87.     }

  88.     public function cost()
  89.     {
  90.         return $this->ice->cost() + 8;
  91.     }
  92. }


  93. // example
  94. // 购买一个奶油香草冰激凌
  95. $ice_object = new MilkIce();
  96. $ice_object = new Herb($ice_object);
  97. echo $ice_object->cost();
  98. echo $ice_object->getDescription();

  99. // 购买一个沙冰+香草+草莓
  100. $ice2 = new SlushIce();
  101. $ice2 = new Herb($ice2);
  102. $ice2 = new Berries($ice2);
  103. echo $ice2->cost();
  104. echo $ice2->getDescription();



是不是有些像递归调用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP