设计模式之装饰者模式:星巴克咖啡

  1. package decorate;

  2.  
  3. /*headfirst设计模式 第三章节 装饰者模式,装饰者模式分为装饰者与被装饰者,它们必须共享同一个超类,或者接口,因为只有这样,才可以用

  4. * 装饰者替换被装饰者(被装饰者对象被装饰者装饰后变成了装饰者对象,只有它们两个对象可以相互替换才可使用装饰者模式)

  5. * 本章节把咖啡饮料比作被装饰者,把调料比作装饰者,用新的调料来装饰饮料,得到新的装饰者对象

  6. */

  7. abstract class Beverage //装饰者与被装饰者共享的超类,这里是个抽象类

  8. {

  9. String description = "Unknown Beverage"; //饮料描述,此时为未知饮料

  10. public String getDescription() //获取饮料描述的方法

  11. {

  12. return description;

  13. }

  14. public abstract double cost(); //抽象方法,获取价格金额

  15. }

  16.  
  17. abstract class CondimentDecorator extends Beverage //为装饰者的实现写的一个抽象类,所有装饰者继承该类

  18. {

  19. public abstract String getDescription(); //装饰者内部需要重写获取描述的方法,因为每装饰一次,就添加了新的配料

  20. }

  21.  
  22. class Espresso extends Beverage //具体化了一个饮料类,黑咖啡

  23. {

  24. public Espresso()

  25. {

  26. description = "espresso"; //描述变更为黑咖啡

  27. }

  28. public double cost()

  29. {

  30. return 1.99; //返回黑咖啡价格

  31. }

  32. }

  33.  
  34. class HouseBlend extends Beverage //具体化了一个饮料类,混合咖啡

  35. {

  36. public HouseBlend()

  37. {

  38. description = "houseblend"; //描述变更为混合咖啡

  39. }

  40. public double cost()

  41. {

  42. return .89; //返回混合咖啡的价格

  43. }

  44. }

  45.  
  46. class Mocha extends CondimentDecorator //具体化了一个配料类,摩卡

  47. {

  48. Beverage beverage; //声明一个Beverage是为了保存被装饰者的品种,方便根据该品种描述与价格计算装饰后的描述与价格

  49. public Mocha(Beverage bever)

  50. {

  51. this.beverage = bever; //构造器里设置当前被装饰者品种

  52. }

  53. public String getDescription()

  54. {

  55. return beverage.getDescription() + ",mocha"; //返回被装饰者与本装饰者mocha叠加的名称

  56. }

  57. public double cost()

  58. {

  59. return beverage.cost() + .20; //返回装饰者与被装饰者的价格之和

  60. }

  61. }

  62.  
  63. class Whip extends CondimentDecorator //具体化了一个配料类,奶泡,以下代码功能与mocha配料一致

  64. {

  65. Beverage beverage;

  66. public Whip(Beverage bever)

  67. {

  68. this.beverage = bever;

  69. }

  70. public String getDescription()

  71. {

  72. return beverage.getDescription() + ",whip";

  73. }

  74. public double cost()

  75. {

  76. return beverage.cost() + .41;

  77. }

  78. }

  79.  
  80. public class decorate {

  81.  
  82. public static void main(String[] args)

  83. {

  84. Beverage espresso1 = new Espresso(); //实例化一个espresso对象

  85. System.out.println(espresso1.getDescription() + ":" + espresso1.cost()); //输出只有espresso没有配料的描述与价格

  86. espresso1 = new Mocha(espresso1); //用Mocha配料装饰espresso,装饰的过程即创建一个装饰者对象的过程,把被装饰者作为形参传递进去,结合该装饰者信息与装饰者信息结合,制造出一个装饰后的对象

  87. System.out.println(espresso1.getDescription() + ":" + espresso1.cost()); //输出espresso被mocha装饰后的描述与价格

  88. espresso1 = new Whip(espresso1); //继续用whip装饰被mocha装饰后的espresso

  89. System.out.println(espresso1.getDescription() + ":" + espresso1.cost()); //输出被两种配料装饰后的描述与价格

  90. }

  91.  
  92. }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值