装饰者模式

tech2023-06-03  114

装饰者模式的定义 装饰者模式:动态的将新功能附加到对象上。对对象功能扩展方面,比继承更有弹性。 原理: 1)装饰者模式就像打包一个快递 主体:比如:陶瓷、衣服 //被装饰者 包装:比如:报纸填充、塑料泡沫、纸板 2)主体:比如类似前面的Drink 3)ConcreteComponent 和Decorator ConcreteComponent:具体的主体 比如前面的各个单品咖啡 4)装饰者 :比如各种调料 所有的类都直接或间接继承父类。

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("费用1: "+order.cost()); System.out.println("描述信息: "+order.getDes()); //加入巧克力 order = new chocolate(order); System.out.println("费用1: "+order.cost()); System.out.println("描述信息: "+order.getDes()); } } public class Soy extends Decorator { public Soy(Drink obj) { super(obj); setDes("豆浆"); setPrice(1.5f); } } public class Milk extends Decorator { public Milk(Drink obj) { super(obj); setDes("牛奶"); setPrice(2.0f); } } //调味品的价格 public class chocolate extends Decorator{ public chocolate(Drink obj) { super(obj); setDes("巧克力"); setPrice(3.0f); } } public class ShortBlack extends Coffee { public ShortBlack() { setDes("shortBlack"); setPrice(4.0f); } } public class LongBlack extends Coffee { public LongBlack() { setDes("美式咖啡"); setPrice(5.0f); } } public class Coffee extends Drink { @Override public float cost() { return super.getPrice(); } } 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(); } 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 super.des+" "+super.getPrice()+"&&"+obj.getDes(); } }
最新回复(0)