装饰者模式
一、定义
动态的给一个对象添加一些额外的职责。装饰者模式提供一个弹性的继承替代方案来实现功能的扩展。
二、类图表示

三、实现
1、Component
package pattern.structual.decorator;
public abstract class Component {
	public abstract void operation();
}
package pattern.structual.decorator;
public class ConcreteComponent extends Component {
	@Override
	public void operation() {
		System.out.println("ConcreteComponent operation...");
	}
}
2、Decorator
- AbstractorDecorator
package pattern.structual.decorator;
public abstract class Decorator extends Component {
	protected Component component;
	
	public void setComponent(Component component){
		this.component = component;
	}
	
	@Override
	public void operation() {
		component.operation();
	}
}
- ConcreteDecorator
package pattern.structual.decorator;
public class ConcreteDecoratorA extends Decorator {
	private String addedState;
	
	@Override
	public void operation() {
		super.operation();
		addedState = "new state";
		System.out.println("DecoratorA added a new state...");
	}
}
package pattern.structual.decorator;
public class ConcreteDecoratorB extends Decorator {
	@Override
	public void operation() {
		super.operation();
		this.addedBehavior();
	}
	
	public void addedBehavior(){
		System.out.println("DecoratorB addedBehavior...");
	}
}
四、使用
package pattern.structual.decorator;
public class Client {
	public static void main(String[] args) {
		Component component = new ConcreteComponent();
		
		//使用ConcreteDecoratorA装饰
		Decorator decoratorA = new ConcreteDecoratorA();
		decoratorA.setComponent(component);
		decoratorA.operation();
		
		System.out.println();
		
		//使用ConcreteDecoratorB装饰
		Decorator decoratorB = new ConcreteDecoratorB();
		decoratorB.setComponent(component);
		decoratorB.operation();
		
		System.out.println();
		
		//先使用ConcreteDecoratorA装饰,再使用ConcreteDecoratorB装饰
		decoratorB.setComponent(decoratorA);
		decoratorB.operation();
	}
}
- 程序输出:

五、适用场合
- 在不影响其他对象的情况下,对某个现有对象动态的增加一个新职责或功能
- 当不能通过增加子类实现扩展时(有两种情况:使用继承方式会造成子类膨胀或类定义被隐藏不能生成子类)