装饰者模式(Decorator),又叫包装者模式(wapper)
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
因为参考网上说法都不太一样,故按照我理解的意思描述下装饰者模式,以希望给后来者一些稍微的指引:
通俗地说就是包装对象,在不影响其他对象的情况下,动态,透明地给单个对象添加一些功能
装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,如图:
需要几个部件:
1接口,或者抽象类
2被装饰者实现该接口,或者继承该抽象类
3装饰者实现该接口,或者继承该抽象类,定义被装饰对象的实例,对该实例进行进行包装
以常见的io接口类来说
抽象类InputStream
public abstract class InputStream implements Closeable
抽象类InputStream的子类FileInputStream,被装饰者
public class FileInputStream extends InputStream
抽象类InputStream的子类FilterInputStream,装饰者
public class FilterInputStream extends InputStream
protected volatile InputStream in;
//定义抽象类InputStream的实例,下行的构造方法中把这个实例传过来
protected FilterInputStream(InputStream in) {
this.in = in;
}
FilterInputStream的子类BufferedInputStream,继承了父类的装饰功能
public class BufferedInputStream extends FilterInputStream
所以会有这样的语句:BufferedInputStream对InputStream的实例进行包装
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("G:\\x269all.rmvb"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("G:\\x256.rmvb"));
自定义包装类:
接口:
public interface DrinkDecorator {
void add();
}
实现类,被包装者
public class Coffee implements DrinkDecorator {
public void add() {
System.out.println("add some coffee ");
System.out.println("add some water");
}
}
实现类,包装者:
public class SweetCoffee implements DrinkDecorator {
Coffee coffee;
public SweetCoffee(Coffee coffee) {
this.coffee = coffee;
}
public void add() {
coffee.add();
System.out.println("add some sugar");
System.out.println("this is a sweet coffee");
}
}
测试类:
public class DecoratorTest {
public static void main(String[] args) {
SweetCoffee sc = new SweetCoffee(new Coffee());
sc.add();
}
}
out:
add some coffee
add some water
add some sugar
this is a sweet coffee