目录
1.核心本质
装饰器模式通过递归组合来实现对对象行为的动态增加,同时保持接口的一致性,使得客户端可以透明地使用装饰后的对象。
装饰器模式和代理模式的区别:
装饰器是用来动态增加对象的功能,通过递归实现。
代理模式是控制对象的访问,通过生成代理对象。
2.组成结构
1.抽象构建角色:coffee接口
2.具体构建角色:StubkCoffee,LuckingCoffee
3.装饰器角色:Milk,Sugar
4.具体装饰器角色:测试类 进行具体的组装
3.代码实现
3.1 coffe接口
public interface Coffee {
String getDescription();
double cost();
}
3.2 StubkCoffee,LuckingCoffee
public class LuckingCoffee implements Coffee{
@Override
public String getDescription() {
return "LuckingCoffee";
}
@Override
public double cost() {
return 9.9;
}
}
public class StubkCoffee implements Coffee{
@Override
public String getDescription() {
return "StubkCoffee";
}
@Override
public double cost() {
return 33;
}
}
3.3 Milk,Sugar
public class Milk implements Coffee {
protected Coffee coffee;
public Milk(Coffee coffee){
this.coffee=coffee;
}
@Override
public String getDescription() {
return coffee.getDescription() + "牛奶";
}
@Override
public double cost() {
return coffee.cost() + 3;
}
}
public class Sugar implements Coffee{
protected Coffee coffee;
public Sugar(Coffee coffee){
this.coffee = coffee;
}
@Override
public String getDescription() {
return coffee.getDescription()+ "加糖";
}
@Override
public double cost() {
return coffee.cost() + 0.5;
}
}
3.4 测试类
public class Test {
public static void main(String[] args) {
//星巴克 啥都不要
StubkCoffee stubkCoffee = new StubkCoffee();
System.out.println(stubkCoffee.getDescription()+" "+stubkCoffee.cost());
//加糖瑞幸
LuckingCoffee luckingCoffee = new LuckingCoffee();
Sugar sugar = new Sugar(luckingCoffee);
System.out.println(sugar.getDescription()+" "+sugar.cost());
//加奶瑞幸
Milk milk = new Milk(luckingCoffee);
System.out.println(milk.getDescription()+" "+milk.cost());
//加糖加奶星巴克
Milk milk1 = new Milk(new Sugar(stubkCoffee));
System.out.println(milk1.getDescription()+" "+milk1.cost());
}
}
4.JDK源码举例
BufferedWriter使用装饰者模式对writer进行了增强,添加了缓冲区,提供了写数据的效率。
public static void main(String[] args) throws Exception{
FileWriter fileWriter = new FileWriter("test.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write("Hello World");
bufferedWriter.close();
}