概念
- 定义:在不改变原有对象的基础上,动态的给一个对象添加一些额外的职责
- 优点:
(1)装饰类和被装饰类可以独立发展,不相互耦合
(2)装饰模式是继承关系的一个替代方案
(3)装饰模式可以动态的扩展一个实现类的功能 - 缺点
(1)多层装饰比较复杂
(2)出现了更多的类,增加了代码的复杂性 - 使用场景
(1)需要动态的扩展一个类的功能,或给一个类增加附加功能
(2)需要动态的给一个对象增加功能,这些功能可以再动态的撤销
(3)需要为一批兄弟类进行改装或加装功能
代码实现
public abstract class IceShake {
public abstract int cost();
public String elements() {
return "ice";
}
}
public class MongoIceShake extends IceShake {
@Override
public int cost() {
return 10;
}
@Override
public String elements() {
return super.elements() + ",mongo";
}
}
public abstract class Decorator extends IceShake {
private IceShake iceShake;
public Decorator(IceShake iceShake) {
this.iceShake = iceShake;
}
@Override
public int cost() {
return this.iceShake.cost();
}
@Override
public String elements() {
return this.iceShake.elements();
}
}
public class FruitDecorator extends Decorator {
public FruitDecorator(IceShake iceShake) {
super(iceShake);
}
@Override
public int cost() {
return super.cost() + 2;
}
@Override
public String elements() {
return super.elements() + ",fruit";
}
}
public class NutDecorator extends Decorator {
public NutDecorator(IceShake iceShake) {
super(iceShake);
}
@Override
public int cost() {
return super.cost() + 4;
}
@Override
public String elements() {
return super.elements() + ",nut";
}
}
public class Client {
public static void main(String args[]) {
//来一份芒果冰沙
IceShake iceShake = new MongoIceShake();
//加一份坚果
iceShake = new NutDecorator(iceShake);
//加一份水果
iceShake = new FruitDecorator(iceShake);
System.out.println("你要的芒果冰沙的成分有:" + iceShake.elements());
System.out.println("你要的芒果冰沙价格是:" + iceShake.cost());
}
}
来源:CSDN
作者:❤️大米花❤️
链接:https://blog.csdn.net/qq_28032223/article/details/103869205