| 1) 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp) |
| 2) 这里提到的动态的将新功能附加到对象和ocp原则 |
| 1) 装饰者模式就像打包一个快递 |
| 主体:比如:陶瓷、衣服 (Component) |
| 包装:比如:报纸填充、塑料泡沫、纸板、木板(Decorator) |
| 2) Component |
| 主体:比如类似前面的Drink |
| 3) ConcreteComponent和Decorator |
| ConcreteComponent:具体的主体,比如前面的各个单品咖啡 |
| Decorator: 装饰者,比如各调料. |
| 4) 在如图的Component与ConcreteComponent之间,如果ConcreteComponent类很多,还可以设计一个缓冲层,将共有的部分提取出来,抽象层一个类 |

| 1) Drink 类就是前面说的抽象类, Component |
| 2) ShortBlack 就单品咖啡 |
| 3) Decorator 是一个装饰类,含有一个被装饰的对象(Drink obj) |
| 4) Decorator 的cost 方法 进行一个费用的叠加计算,递归的计算价格 |

- 装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack
| 1) Milk包含了LongBlack |
| 2) 一份Chocolate包含了(Milk+LongBlack) |
| 3) 一份Chocolate包含了(Chocolate+Milk+LongBlack) |
| 4) 这样不管是什么形式的单品咖啡+调料组合,通过递归方式可以方便的组合和维护 |

| package com.atguigu.decorator; |
| public abstract class Drink { |
| public String des; |
| private float price = 0.0f; |
| public String getDes() { |
| return des; |
| } |
| public void setDes(String des) { |
| this.des = des; |
| } |
| public float getPrice() { |
| return price; |
| } |
| public void setPrice(float price) { |
| this.price = price; |
| } |
| |
| |
| |
| public abstract float cost(); |
| } |
| |
| package com.atguigu.decorator; |
| public class Coffee extends Drink { |
| |
| @Override |
| public float cost() { |
| |
| return super.getPrice(); |
| } |
| |
| } |
| |
| package com.atguigu.decorator; |
| public class Espresso extends Coffee { |
| |
| public Espresso() { |
| setDes(" 意大利咖啡 "); |
| setPrice(6.0f); |
| } |
| } |
| |
| package com.atguigu.decorator; |
| public class LongBlack extends Coffee { |
| |
| public LongBlack() { |
| setDes(" longblack "); |
| setPrice(5.0f); |
| } |
| } |
| |
| package com.atguigu.decorator; |
| public class DeCaf extends Coffee { |
| |
| public DeCaf() { |
| setDes(" 无因咖啡 "); |
| setPrice(1.0f); |
| } |
| } |
| |
| package com.atguigu.decorator; |
| public class ShortBlack extends Coffee{ |
| |
| public ShortBlack() { |
| setDes(" shortblack "); |
| setPrice(4.0f); |
| } |
| } |
| |
| package com.atguigu.decorator; |
| |
| public class Decorator extends Drink { |
| |
| private Drink obj; |
| |
| public Decorator(Drink obj) { |
| |
| this.obj = obj; |
| } |
| |
| @Override |
| public float cost() { |
| |
| |
| return super.getPrice() + obj.cost(); |
| } |
| |
| @Override |
| public String getDes() { |
| |
| |
| return des + " " + getPrice() + " && " + obj.getDes(); |
| } |
| |
| } |
| |
| package com.atguigu.decorator; |
| |
| public class Chocolate extends Decorator { |
| |
| public Chocolate(Drink obj) { |
| super(obj); |
| setDes(" 巧克力 "); |
| setPrice(3.0f); |
| } |
| |
| } |
| |
| package com.atguigu.decorator; |
| public class Milk extends Decorator { |
| |
| public Milk(Drink obj) { |
| super(obj); |
| |
| setDes(" 牛奶 "); |
| setPrice(2.0f); |
| } |
| |
| } |
| |
| package com.atguigu.decorator; |
| public class Soy extends Decorator{ |
| |
| public Soy(Drink obj) { |
| super(obj); |
| |
| setDes(" 豆浆 "); |
| setPrice(1.5f); |
| } |
| |
| } |
| |
| package com.atguigu.decorator; |
| public class CoffeeBar { |
| |
| public static void main(String[] args) { |
| |
| |
| Drink order = new LongBlack(); |
| System.out.println("费用1=" + order.cost()); |
| System.out.println("描述=" + order.getDes()); |
| |
| order = new Milk(order); |
| System.out.println("order 加入一份牛奶 费用 =" + order.cost()); |
| System.out.println("order 加入一份牛奶 描述 = " + order.getDes()); |
| |
| order = new Chocolate(order); |
| System.out.println("order 加入一份牛奶 加入一份巧克力 费用 =" + order.cost()); |
| System.out.println("order 加入一份牛奶 加入一份巧克力 描述 = " + order.getDes()); |
| |
| order = new Chocolate(order); |
| System.out.println("order 加入一份牛奶 加入2份巧克力 费用 =" + order.cost()); |
| System.out.println("order 加入一份牛奶 加入2份巧克力 描述 = " + order.getDes()); |
| System.out.println("==========================="); |
| |
| Drink order2 = new DeCaf(); |
| System.out.println("order2 无因咖啡 费用 =" + order2.cost()); |
| System.out.println("order2 无因咖啡 描述 = " + order2.getDes()); |
| order2 = new Milk(order2); |
| System.out.println("order2 无因咖啡 加入一份牛奶 费用 =" + order2.cost()); |
| System.out.println("order2 无因咖啡 加入一份牛奶 描述 = " + order2.getDes()); |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-08-31 vue开发:前端项目模板