意图
装饰模式以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。
类图与角色
抽象构件(Component):具体构件必须实现的接口。
具体构件(Concrete Component):对Component接口的实现。
装饰者接口(Decorator):持有一个构件(component)对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰者(Concrete Decorator):对Decorator接口的实现。
实例
//抽象构件
interface Engine{//引擎
public void work();
}
//具体构件
class GermanyEngine implements Engine{
public void work(){
System.out.println("引擎正常运转");
}
}
//装饰者接口
abstract class MonitorEngine implements Engine{//具有监视功能的引擎
private Engine engine;
public MonitorEngine(Engine engine){
this.engine=engine;
}
@Override
public void work(){
engine.work();
}
}
//具体装饰者
class TemperatureMonitorEngine extends MonitorEngine{
public TemperatureMonitorEngine(Engine engine){
super(engine);
}
@Override
public void work(){
System.out.println("获取温度并发送给监控系统");
super.work();
}
}
class SpeedMonitorEngine extends MonitorEngine{
public SpeedMonitorEngine(Engine engine){
super(engine);
}
public void work(){
System.out.println("获引擎转速并发送给监控系统");
super.work();
}
}
class OilMonitorEngine extends MonitorEngine{
public OilMonitorEngine(Engine engine){
super(engine);
}
public void work(){
System.out.println("获引擎油量并发送给监控系统");
super.work();
}
}
//客户端代码
class test {
public static void main (String[] args) throws java.lang.Exception{
Engine engine=new GermanyEngine();
engine=new TemperatureMonitorEngine(engine);
engine=new SpeedMonitorEngine(engine);
engine=new OilMonitorEngine(engine);
engine.work();
}
}
Java I/O中的装饰模式
FileInputStream类结构图
InputStream类就是抽象组件。
FileInputStream就是具体组件,它实现了抽象组件的所有接口。
FilterInputStream类无疑就是装饰角色,它实现了InputStream类的所有接口,并且持有InputStream的对象引用。
BufferedInputStream是具体的装饰实现者,它给InputStream类附加了功能,这个装饰器类的作用就是使得InputStream读取的数据保存在内存中,而提高读取的性能。