Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798714
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: C/C++

2012-03-25 18:48:53

如果你有一杯咖啡,你可以往里面加牛奶,同时也可以加糖。各种咖啡价格都不同,如此可能得到下面的类层次。


  1. class Coffee { public: virtual double cost() { return 1; } };

  2. class CoffeeWithMilk : public Coffee { public: virtual double cost() { return 2; } };

  3. class CoffeeWithSugar : public Coffee { public: virtual double cost() { return 1.5; } };

  4. class CoffeeWithSugarAndMilk : public Coffee { public: virtual double cost() { return 2.5; } };

如果我同时可以加入豆浆或者蜂蜜,那么类的数量会瞬间膨胀。这时装饰者模式可以派上用场。


  1. class CoffeeDecorator : public Coffee
  2. {
  3. protected:
  4.     CoffeeDecorator(Coffee* pCoffee) : mpCoffee(pCoffee) {}
  5.     Coffee* mpCoffee;
  6. };

  7. class MilkDecorator : public CoffeeDecorator
  8. {
  9. public:
  10.     MilkDecorator(Coffee* coffee) : CoffeeDecorator(pCoffee) {}
  11.     virtual double cost() { return mpCoffee->cost() + 1; }
  12. };

  13. class SugarDecorator : public CoffeeDecorator
  14. {
  15. public:
  16.     SugarDecorator(Coffee* coffee) : CoffeeDecorator(pCoffee) {}
  17.     virtual double cost() { return mpCoffee->cost() + 0.5; }
  18. };

如此一来就可以随意搭配这杯咖啡,甚至可以同时加两杯牛奶:


  1. int main()
  2. {
  3.     Coffee* pCoffee = new MilkDecorator(new SugarDecorator(new Coffee));
  4.     double d = pCoffee->cost();
  5.     return 0;
  6. }

设计原则:类应该对扩展开放,对修改关闭。 (开放-关闭原则)

阅读(932) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~