目录
0、定义
1、装饰模式包含的四种角色
2、装饰模式的UML类图
3、示例代码
0、定义
动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。
1、装饰模式包含的四种角色
- 抽象组件(Component):抽象组件是一个抽象类。抽象组件定义了“被装饰者”需要进行“装饰”的方法。
- 具体组件(ConcreteComponent):具体组件是抽象组件的一个子类,具体组件的实例称作“被装饰者”
- 装饰(Decorator):装饰也是抽象组件的一个子类,但装饰还包含一个抽象组件声明的变量以保存“被装饰者”的引用。装饰可以是抽象类也可以是一个非抽象类,如果是非抽象类,那么该类的实例称作“装饰者”。
- 具体装饰(ConcreteDecorator):具体装饰是装饰的一个非抽象子类,具体装饰的实例称作“装饰者”。
2、装饰模式的UML类图

3、示例代码
抽象组件
package xyz.jangle.design.decorator;
public abstract class Component {
	
	public abstract void methodOne();
	
	public abstract void methodTwo();
}
具体组件
package xyz.jangle.design.decorator;
public class ConcreteComponent extends Component {
	@Override
	public void methodOne() {
		System.out.println("前进100米");
	}
	@Override
	public void methodTwo() {
		System.out.println("前进200米");
	}
}
装饰
package xyz.jangle.design.decorator;
public abstract class Decorator extends Component {
	
	protected Component component;
	public Decorator(Component component) {
		super();
		this.component = component;
	}
	@Override
	public abstract void methodOne();
	@Override
	public abstract void methodTwo();
}
具体装饰A
package xyz.jangle.design.decorator;
public class ConcreteDecoratorA extends Decorator {
	public ConcreteDecoratorA(Component component) {
		super(component);
	}
	@Override
	public void methodOne() {
		component.methodOne();
		otherMethod();
	}
	@Override
	public void methodTwo() {
		component.methodTwo();
		otherMethod();
	}
	
	public void otherMethod() {
		System.out.println("再前进50米");
	}
}
具体装饰B
package xyz.jangle.design.decorator;
public class ConcreteDecoratorB extends Decorator {
	public ConcreteDecoratorB(Component component) {
		super(component);
	}
	@Override
	public void methodOne() {
		component.methodOne();
		otherMethod();
	}
	@Override
	public void methodTwo() {
		component.methodTwo();
		otherMethod();
	}
	
	public void otherMethod() {
		System.out.println("再前进150米");
	}
}
客户端(使用)
package xyz.jangle.design.decorator;
public class AppMain6 {
	public static void main(String[] args) {
		ConcreteComponent component = new ConcreteComponent();	// 创建具体组件
		component.methodOne();
		System.out.println("----------------");
		ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(component);	//装饰具体组件
		decoratorA.methodOne();
		System.out.println("----------------");
		ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(decoratorA);	//在装饰上再进行装饰
		decoratorB.methodTwo();
	}
}
输出结果:
前进100米
----------------
前进100米
再前进50米
----------------
前进200米
再前进50米
再前进150米



















