装饰者模式(Decorator Pattern)

装饰者模式(Decorator Pattern):动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案

:装饰者模式的,常常造成设计中有大量的小类,在实例化组件时增加代码的复杂度

 

实例:连锁咖啡店订单系统,如果使用继承的方法,每种饮料,以加入的调料不同而声明不同的类,那么类爆炸就不幸地发生了

 

代码:

JAVA

  1. abstract class Beverage
  2. {
  3.     String description = "";
  4.     public String getDescription()
  5.     {
  6.         return description;
  7.     }
  8.     public abstract double cost();
  9. }
  10. abstract class CondimentDecorator extends Beverage
  11. {
  12.     public abstract String getDescription();
  13. }
  14. class Espresso extends Beverage
  15. {
  16.     public Espresso()
  17.     {
  18.         description = "Espresso";
  19.     }
  20.     public double cost()
  21.     {
  22.         return 1.99;
  23.     }
  24. }
  25. class HouseBlend extends Beverage
  26. {
  27.     public HouseBlend()
  28.     {
  29.         description = "House Blend Coffee";
  30.     }
  31.     public double cost()
  32.     {
  33.         return 0.89;
  34.     }
  35. }
  36. class Mocha extends CondimentDecorator
  37. {
  38.     Beverage beverage;
  39.     public Mocha(Beverage beverage)
  40.     {
  41.         this.beverage = beverage;
  42.     }
  43.     public String getDescription()
  44.     {
  45.         return beverage.getDescription() + ", Mocha";
  46.     }
  47.     public double cost()
  48.     {
  49.         return 0.20 + beverage.cost();
  50.     }
  51. }
  52. class Soy extends CondimentDecorator
  53. {
  54.     Beverage beverage;
  55.     public Soy(Beverage beverage)
  56.     {
  57.         this.beverage = beverage;
  58.     }
  59.     public String getDescription()
  60.     {
  61.         return beverage.getDescription()+", Soy";
  62.     }
  63.     public double cost()
  64.     {
  65.         return 0.15 + beverage.cost();
  66.     }
  67. }
  68. class Whip extends CondimentDecorator
  69. {
  70.     Beverage beverage;
  71.     public Whip(Beverage beverage)
  72.     {
  73.         this.beverage = beverage;
  74.     }
  75.     public String getDescription()
  76.     {
  77.         return beverage.getDescription() + ", Whip";
  78.     }
  79.     public double cost()
  80.     {
  81.         return 0.10 + beverage.cost();
  82.     }
  83. }
  84. public class StarbuzzCoffee
  85. {
  86.     public static void main(String args[])
  87.     {
  88.         Beverage beverage = new Espresso();
  89.         System.out.println(beverage.getDescription() + " $ " + beverage.cost());
  90.         Beverage beverage1 = new Espresso();
  91.         beverage1 = new Mocha(beverage1);
  92.         beverage1 = new Mocha(beverage1);
  93.         beverage1 = new Whip(beverage1);
  94.         System.out.println(beverage1.getDescription()+" $ "+beverage1.cost());
  95.         Beverage beverage2 = new HouseBlend();
  96.         beverage2 = new Soy(beverage2);
  97.         beverage2 = new Mocha(beverage2);
  98.         beverage2 = new Whip(beverage2);
  99.         System.out.println(beverage2.getDescription() + " $ " + beverage2.cost());
  100.     }
  101. }

 

C++:

  1. // StarbuzzCoffee.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <string>
  5. #include <iostream>
  6. using namespace std;
  7. class Beverage
  8. {
  9. protected:
  10.     string description;
  11.     
  12. public:
  13.     virtual string getDescription()
  14.     {
  15.         return description;
  16.     }
  17.      virtual double cost()=0;
  18. };
  19. class CondimentDecorator : public Beverage
  20. {
  21. public:
  22.     virtual string getDescription()=0;
  23.     
  24. };
  25. class Espresso : public Beverage
  26. {
  27. public:
  28.     Espresso()
  29.     {
  30.         description = "Espresso";
  31.     }
  32.      double cost()
  33.     {
  34.         return 1.99;
  35.     }
  36. };
  37. class HouseBlend  : public Beverage
  38. {
  39. public:
  40.     HouseBlend()
  41.     {
  42.         description = "House Blend Coffee";
  43.     }
  44.     double cost()
  45.     {
  46.         return 0.89;
  47.     }
  48. };
  49. class Mocha :public CondimentDecorator
  50. {
  51. private:
  52.     Beverage* beverage;
  53. public:
  54.     Mocha(Beverage* beverage)
  55.     {
  56.         this->beverage = beverage;
  57.     }
  58.     string getDescription()
  59.     {
  60.         return beverage->getDescription() + ", Mocha";
  61.     }
  62.     double cost()
  63.     {
  64.         return 0.20 + beverage->cost();
  65.     }
  66. };
  67. class Soy :public CondimentDecorator
  68. {
  69. private:
  70.     Beverage* beverage;
  71. public:
  72.     Soy(Beverage* beverage)
  73.     {
  74.         this->beverage = beverage;
  75.     }
  76.     string getDescription()
  77.     {
  78.         return beverage->getDescription()+", Soy";
  79.     }
  80.     double cost()
  81.     {
  82.         return 0.15 + beverage->cost();
  83.     }
  84. };
  85. class Whip:public CondimentDecorator
  86. {
  87. private:
  88.     Beverage* beverage;
  89. public:
  90.     Whip(Beverage* beverage)
  91.     {
  92.         this->beverage = beverage;
  93.     }
  94.     string getDescription()
  95.     {
  96.         return beverage->getDescription() + ", Whip";
  97.     }
  98.     double cost()
  99.     {
  100.         return 0.10 + beverage->cost();
  101.     }
  102. };
  103. int _tmain(int argc, _TCHAR* argv[])
  104. {
  105.     Beverage *beverage=new Espresso();
  106.     cout<<beverage->getDescription() <<" $ " << beverage->cost()<<endl;
  107.     Beverage *beverage1=new Espresso();
  108.     beverage1=new Mocha(beverage1);
  109.     beverage1=new Mocha(beverage1);
  110.     beverage1 = new Whip(beverage1);
  111.     cout<<beverage1->getDescription() <<" $ " << beverage1->cost()<<endl;
  112.     Beverage* beverage2 = new HouseBlend();
  113.     beverage2 = new Soy(beverage2);
  114.     beverage2 = new Mocha(beverage2);
  115.     beverage2 = new Whip(beverage2);
  116.     cout<<beverage2->getDescription() <<" $ " << beverage2->cost()<<endl;
  117.     return 0;
  118. }

 

结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值