装饰者模式
属于结构型模式
装饰者模式动态的给一个对象添加一些额外的职责
为什么使用装饰者模式
通常使用继承类来扩展功能, 如果功能种类很多, 会造成类爆炸(类的数量很多);不方便管理
使用装饰者模式, 可以让用户决定动态的加入扩展功能;
使用装饰者模式
装饰者模式有Component(主体), (装饰部分),ConcreteComponent(具体的主体);
装饰者和具体的主体都要继承主体;装饰者内维护一个主体,并将主体进行装饰.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| public abstract class Drink { public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } private double price = 0.0d; private String info; public abstract double cost(); }
public class Coffee extends Drink { public Coffee() { setInfo("咖啡"); setPrice(18d); } @Override public double cost() { return getPrice(); } }
public class MilkTea extends Drink { public MilkTea() { setInfo("奶茶"); setPrice(15d); } @Override public double cost() { return getPrice(); } }
public class Decorator extends Drink { private Drink drink; @Override public String getInfo() { return super.getInfo()+" "+drink.getInfo(); } @Override public double cost() { return super.getPrice()+drink.cost(); } public Decorator(Drink drink){ this.drink=drink; } }
public class MilkCap extends Decorator { public MilkCap(Drink drink) { super(drink); setInfo("加奶盖"); setPrice(6d); } }
public class Cheese extends Decorator { public Cheese(Drink drink) { super(drink); setInfo("加芝士"); setPrice(5d); } }
@Test public void testDecorator(){ Drink coffee=new Coffee(); System.out.println(coffee.getInfo()+coffee.cost()); Drink coffee1=new MilkCap(coffee); System.out.println(coffee1.getInfo()+coffee1.cost()); Drink coffee2=new Cheese(coffee1); System.out.println(coffee2.getInfo()+coffee2.cost());
System.out.println("===============================");
Drink milkTea=new MilkTea(); System.out.println(milkTea.getInfo()+milkTea.cost()); Drink milkTea1=new Cheese(milkTea); System.out.println(milkTea1.getInfo()+milkTea1.cost()); Drink milkTea2=new MilkCap(milkTea1); System.out.println(milkTea2.getInfo()+milkTea2.cost()); }
|
Anything can go right will go right