步骤一:定义一个基类,里面放置需要装饰的方法,基类可以是类,也可以是接口
public interface Sourceable {
public void method();
}
步骤二:定义一个被装饰类,继承(实现)基类
public class Source implements Sourceable{
@Override
public void method() {
System.out.println("这是方法一");
}
}
步骤三:定义一个装饰者,(直接或者间接继承基类)这里是直接实现了基类,也可以继承基类的直接子类。
保存基类的实例
public class Decorator implements Sourceable{
private Sourceable source;
public Decorator(Sourceable source) {
super();
this.source=source;
}
@Override
public void method() {
System.out.println("在前面装饰一下");
source.method();
System.out.println("在后面装饰一下");
}
public void method2() {
System.out.println("在前面装饰一下");
source.method();
System.out.println("在后面装饰一下");
}
}
步骤四:测试一下(注意调用的方式,要将被装饰者实例传入装饰者中)
public class Test {
public static void main(String[] args) {
Sourceable source=new Source();
Sourceable obj=new Decorator(source);
obj.method();
}
}
在IO中的InputStream和OutputStream就是使用了装饰者模式,这里我们使用InputStream来简单记录下。
被装饰者 FilterInputStream
-------------------------------------------------------------------------------------------------------------------------------
装饰者 BufferedInputStream
----------------------------------------------------------------------------------------------------------------------------
BufferedInputStream的子类并不是增加了FilterInputStream流的来源,而只是改善了流读取方法,比如添加了缓存,直接读取int,String等类型。
可以这样简单的认为,InputStream的直接子类是“目的”,而FilterInpustStream的子类是“方法”,我们用一个InputStream就是要用目的和方法。