装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰器模式中的角色有:
1、抽象构件角色
给出一个抽象接口,以规范准备接受附加责任的对象
2、具体构建角色
顶一个具体实现附加责任的类
3、装饰角色
继承或者实现顶层对象或者接口,拥有顶层接口的引用
4、具体装饰角色
继承装饰角色,添加额外装饰功能
举例说明:车的方法是 run。还有的车除了run还可以fly, 也还可以swim。代码如下
定义抽象构件角色:
public interface Car {
public void run();
}
具体构件角色:
public class RunCar implements Car{
public void run() {
System.out.println("can run!");
}
}
装饰角色:
public abstract class CarDecorator implements Car{
Car car;
public CarDecorator(Car car) {
this.car = car;
}
public void run() {
car.run();
}
}
具体装饰角色:
public class FlyCarDecorator extends CarDecorator{
public FlyCarDecorator(Car car) {
super(car);
}
public void run() {
super.run();
fly();
}
public void fly(){ //添加飞的功能
System.out.println("can fly!");
}
}
public class SwimCarDecorator extends CarDecorator{
public SwimCarDecorator(Car car) {
super(car);
}
public void run() {
super.run();
swim();
}
public void swim(){ //添加游的功能
System.out.println("can swim!");
}
}
测试运行:
public class MainTest {
public static void main(String[] args) {
Car car = new RunCar();
FlyCarDecorator flyCarDecorator = new FlyCarDecorator(car);
SwimCarDecorator swimCarDecorator = new SwimCarDecorator(flyCarDecorator);
swimCarDecorator.run();
}
}
运行结果为:can run! can fly! can swim!
装饰器模式在Java体系中的经典应用是Java I/O:比如inputstream
抽象构件角色:inputstream
具体构件角色:ByteArrayInputStream、FileInputStream、ObjectInputStream、PipedInputStream 他们都继承了inputstream
装饰角色:FilterInputStream FilterInputStream实现了InputStream内的所有抽象方法并且持有一个InputStream的引用
具体装饰角色:InflaterInputStream、BufferedInputStream、DataInputStream 全部继承了FilterInputStream
读取文件可以如下
File file = new File("D:/a.txt"); InputStream in1 = new FileInputStream(file); InputStream in2 = new BufferedInputStream(new FileInputStream(file)); InputStream in3 = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
in1 为 直接读取file
in2 给fileInputSteam 添加缓冲功能,使得FileInputStream读取文件的内容保存在内存中,以提高读取的功能
in3 给fileInputSteam 添加缓冲功能,因为它有DataInputStream和BufferedInputStream两个附加的功能