设计模式
设计模式之装饰者模式
装饰者模式
原理
- 装饰者模式就像打包一个快递
主体:比如:陶瓷、衣服(Component) //被装饰者
包装:比如:报纸填充、塑料泡沫、纸板、木板(Decorator) - Component主体:比如类似前面的Drink
- ConcreteComponent 和 Decorator
ConcreteComponent:具体的主体,
比如前面的各个单品咖啡 - Decorator:装饰者,比如各调料.
在如图的Component与ConcreteComponent之间,如果ConcreteComponent类很多,还可以设计一个缓冲层,将 共有的部分提取出来,抽象层一个类。
代码
1.创建Drink抽象类:
package parent;
public abstract class Drink {
public String dec;
private double cost=0;
public String getDec() {
return dec;
}
public void setDec(String dec) {
this.dec = dec;
}
public double getCost() {
return cost;
}
public void setCost(double cost) {
this.cost = cost;
}
public abstract double cost() ;
}
2.创建Coffee类:
package parent;
public class Coffee extends Drink{
@Override
public double cost() {
return super.getCost();
}
@Override
public String getDec() {
return super.getDec()+"[]"+super.getCost();
}
}
3.创建Decorator类:
package parent;
public class Decorator extends Drink{
private Drink drink;
public Decorator(Drink drink,String des,double cost) {
this.drink = drink;
setDec(des);
setCost(cost);
}
@Override
public double cost() {
return super.getCost()+drink.cost();
}
@Override
public String getDec() {
return super.getDec()+"[]"+super.getCost()+"[]"+drink.getDec();
}
}
4.创建Coffee实例:
package parent;
public class EspressoCoffee extends Coffee{
public EspressoCoffee() {
setDec("意大利咖啡");
setCost(3);
}
}
package parent;
public class LongCoffee extends Coffee{
public LongCoffee() {
setDec("长咖啡");
setCost(6);
}
}
5.创建Decorator实例:
package parent;
public class Chocolate extends Decorator{
public Chocolate(Drink drink) {
super(drink, "巧克力", 1);
}
}
package parent;
public class Milk extends Decorator{
public Milk(Drink drink) {
super(drink, "牛奶", 2);
}
}
6.调用:
package parent;
public class Client {
public static void main(String[] args) {
LongCoffee longCoffee = new LongCoffee();
Milk milk = new Milk(longCoffee);
Chocolate chocolate = new Chocolate(milk);
System.out.println("价格是:"+chocolate.getDec()+":"+chocolate.cost());
}
}
总结
使用场景:动态地给一些对象添加一些额外的职责但又不想增加子类,功能随时组合
优点:
- Decorator 模式与继承关系的目的都是要扩展对象的功能,但是 Decorator 可以提供比继承更多的灵活性。
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计者可以创造出很多不同行为的组合。
缺点:
- 用导致架构复杂:这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。