一、概念ide
装饰模式动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活,属于结构性模式一种。
二、模式结构this
三、使用场景调试
四、优缺点code
优势:cdn
缺点:对象
五、实例继承
在购买奶茶的时候,常常会有选择配料的选项,每种配料的价格不同,能够多种组合,价格也不同。首先先定义奶茶的接口,具备名称和价格方法接口
public interface IMilkTea { String name(); double price(); }
继承IMilkTea的相关茶类class
public class RedTea implements IMilkTea { @Override public String name() { return "红茶"; } @Override public double price() { return 10; } }
public class GreenTea implements IMilkTea { @Override public String name() { return "绿茶"; } @Override public double price() { return 12; } }
定义具体装饰类Decorator,装饰相关奶茶
public class Decorator implements IMilkTea { @Override public String name() { return null; } @Override public double price() { return 0; } }
继承Decorator的相关类
public class IceCream extends Decorator { private String name = "加雪糕"; private IMilkTea milkTea; public IceCream(IMilkTea milkTea) { this.milkTea = milkTea; } @Override public String name() { return milkTea.name() + name; } @Override public double price() { return milkTea.price() + 3; } }
public class Pearl extends Decorator { private String name = "加珍珠"; private IMilkTea milkTea; public Pearl(IMilkTea milkTea) { this.milkTea = milkTea; } @Override public String name() { return milkTea.name() + name; } @Override public double price() { return milkTea.price() + 2; } }
客户端使用
public static void main(String[] args) { IMilkTea milkTea = new RedTea(); milkTea = new IceCream(milkTea); milkTea = new Pearl(milkTea); System.out.println(milkTea.name() + "\n价格:" + milkTea.price()); }