众所周知,代码复用是面向对象中非常重要的一个特点。(decorator)装饰者模式也是所有设计模式中非常重要的一个应用。
装饰者模式又名包装器,由此看来,我们初步的猜想是将类一层一层的包装达到一定功能。
首先来看一下结构图
装饰者模式中有四个参与者
1、Component
这是一个对象接口,可以给这些对象动态添加职责。
2、ConcreteComponent
这是对象的实现类
3、Decorator
装饰者接口
4、ConcreteDecorator
具体的装饰类
代码:
public interface Component { void show(); }
//具体对象
public class Window implements Component { public void show() { System.out.println("生成个窗口"); } }
//装饰类接口
public abstract class Decorator implements Component{ private Component component; public Decorator(Component component){ this.component = component; } public void show() { this.component.show(); } }
//具体装饰实现类
public class BoardDecorator extends Decorator { public BoardDecorator(Component component) { super(component); } @Override public void show(){ super.show(); drawBoard(); } public void drawBoard(){ System.out.println("我画了一条边"); } }
public class ColorDecorator extends Decorator{ public ColorDecorator(Component component) { super(component); } @Override public void show(){ super.show(); drawColor(); } public void drawColor(){ System.out.println("我涂上了红色"); } }
//将对象进行包装
public class Client { public static void main(String[] args){ Component component = new ColorDecorator(new BoardDecorator(new Window())); component.show(); } }结果:
生成个窗口
我画了一条边
我涂上了红色
可见window类被一层层包装了
在java中也有这样的设计模式出现,比如我们的输入输出流。
例如:
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(new File("")));
把简单的文件输入流包装成具有缓冲区的输入流。