装饰模式
1、装饰模式
装饰模式(Decorator)又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,可以在不创造更多的子类的模式下,将对象的功能加以扩展。
2、结构
装饰模式中的各个角色有:
(1)抽象构件角色:给出一个抽象接口,
(2)具体构件角色:对抽象构件角色的具体实现
(3)装饰角色:持有一个构件对象的实例,并定义一个与抽象接口一致的接口。
(4)具体装饰角色:对装饰角色的具体实现。
3、代码
(1)首相构件角色,一个蛋糕抽象类
public abstract class Cake {
String remark = "蛋糕";
public String getRemark() {
return remark;
}
public abstract String getImpression();
}
(2)具体构件角色,一个奶酪蛋糕
public class CheesCake extends Cake {
public CheesCake() {
super.remark = "奶酪蛋糕";
}
@Override
public String getImpression() {
return "香甜感觉";
}
}
(3)装饰角色
public abstract class OtherDecorator extends Cake {
private Cake cake;
public Cake getCake() {
return cake;
}
public OtherDecorator(Cake cake) {
super();
this.cake = cake;
}
public abstract String getRemark();
}
(4)具体装饰角色,一个带果冻的奶酪蛋糕
public class JellyDecorator extends OtherDecorator {
public JellyDecorator(Cake cake) {
super(cake);
super.remark="香甜果冻";
}
@Override
public String getRemark() {
return this.getCake().getRemark()+"+"+this.remark;
}
@Override
public String getImpression() {
return this.getCake().getImpression()+",这个果冻真好吃";
}
}
(5)测试类
public class Client {
public static void main(String[] args) {
Cake c = new CheesCake();
//生成一个带果冻的奶酪蛋糕
Cake jc = new JellyDecorator(c);
System.out.println(c.getRemark());
System.out.println(c.getImpression());
}
}
4、总结
(1)装饰对象和真实对象具有相同的接口,这样客户端对象就可以以真实对象的相同的方式和装饰对象交互。
(2)装饰对象包含一个真实对象的引用(reference).
(3)装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。
(4)装饰对象可以在转发这些请求以前或者以后增加一些附加的功能。这样就能确保在运行时,不用修改给定对象结构就可以在外部增加附加的功能。在面向对象的程序设计中,通常是使用继承的关系来扩展给定类的功能。