和上一章提到的适配器模式很类似,但是装饰者模式和其还是有一定区别的。适配器模式往往是把两个不同标准的接口动态结
合起来,解决不兼容的问题。而装饰者模式往往是装饰者对象和被装饰对象都实现同一个接口,装饰对象持有被装饰对象的实例,
动态的添加一些新功能。
标准接口:
public interface Sourceable {
public void method1();
}
被装饰类:
【Java设计模式——装饰者模式】
public class Source implements Sourceable { @Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("This is the origin method.");
}}
装饰类:
public class Decorator implements Sourceable { private Sourceable s;
public Decorator(Sourceable s) {
this.s = s;
} @Override
public void method1() {
// TODO Auto-generated method stub
s.method1();
System.out.println("After decoration...");
}}
测试类:
public class TestDecorator { @Test
public void test() {
Decorator decorator = new Decorator(new Source());
decorator.method1();
}}
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
最常见的一个应用就是Java IO中的运用。
文章图片
以输出流为例,它本身是一个抽象类,其中定义了各种抽象方法。这些抽象方法都在子类中获得实现。注意这里的
FilterOutputStream,在其类内部维护了一个OutputStream对象,在FilterOutputStream的构造方法中会赋一个OutputStream的实
例。将FilterOutputStream的操作交给OutputStream对象来做,这个类本身什么事都没有做。但是这个类有三个很重要的子类,如上
图所示。举一个例子,以BufferedOutputStream为例,提供了数据的缓冲功能。在这个类内部,对write方法进行了重写。在这里,
BufferedOutputStream就相当于是一个装饰者,为原本不存在缓冲功能的OutputStream加上了缓冲的功能。
装饰者模式的几个例子:
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File...));
PrintStream ps = new PrintStream(new FileOutputStream(new File...));
推荐阅读
- 面试|我经历的IT公司面试及离职感受(转)
- java|设计模式——创建型——工厂方法(Factory Method)
- 设计模式|设计模式_创建型模式——工厂方法
- 设计模式|设计模式——创建型软件设计模式——工厂方法模式
- 设计模式之装饰器模式
- 设计模式之设计原则
- 设计模式六大原则(5)(迪米特法则 最少知道)
- 观察者模式实现之EventBus(Google)
- Java高级面试|常见设计模式——装饰模式
- java设计模式——单例模式