装饰器模式
主要对象:
- 接口
- 被装饰的对象(接口的实现)
- 装饰器超类
- 装饰器
对象之间的关系图:
装饰器和被装饰的对象有两个特点,也是装饰器模式的关键:
- 他们实现同一个接口;
- 装饰器中使用了被装饰的对象。
使用装饰器模式的几个关键点:
- 装饰器和被装饰类要实现同一个接口(实际开发中也可能用继承)。
- 装饰器中的方法可以调用被装饰对象提供的方法,以此实现功能累加的效果。
使用示例:
//接口
public interface Fruit {
public void show();
public int statNumber();
}
//接口的实现类(被装饰的对象)
public class Apple implements Fruit {
@Override
public void show() {
System.out.print("苹果:");
}
@Override
public int statNumber() {
return 0;
}
}
//装饰器超类
public abstract class Decorator implements Fruit {
protected Fruit fruit;
public Decorator(Fruit fruit){
this.fruit = fruit;
}
}
//装饰器
public class BlueDecorator extends Decorator {
public BlueDecorator(Fruit fruit){
super(fruit);
}
@Override
public void show() {
fruit.show();
System.out.print("一个蓝色的 ");
}
@Override
public int statNumber() {
return this.fruit.statNumber() + 1;
}
}
//测试类
public class DecoratorTest {
public static void main(String[] args){
Fruit apple = new RedDecorator(new BlueDecorator(new Apple()));
apple.show();
System.out.println("\n苹果总数:"+fruit.statNumber());
}
}
装饰器模式在InputStream中的使用介绍图: