定义
动态地栓一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活.
角色
1. 抽象构件:
是一个接口或者是抽象类,就是定义最核心的对象,也是原始的对象.
2. 具体构件:
是最核心,最原始,最基本的接口或抽象类的实现.需要装饰的角色.
3. 装饰角色:
一般是一个抽象类,实现接口或者抽象方法,里面不一定有抽象的方法,在它的属性里必然有一个priavte变量指向抽象构件.
4. 具体装饰角色:
装饰成为的其他东西
优点
- 装饰类和被装饰类可以独立发展,面不会相互耦合.
- 装饰模式是继承关系的一个替代方案.
- 装饰模式可以动态地扩展一个实现类的功能.
缺点
多层的装饰比较复杂,尽量减少装饰类的数量,以便降低系统的复杂度.
通用代码
抽象构件
public abstract class Component {
public abstract void operate();
}
具体构件
public class ConcreteComponent extends Component {
@Override
public void operate() {
}
}
抽象装饰类
public abstract class Decorator extends Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operate() {
this.component.operate();
}
}
具体装饰类
public class ConcreteDecorator1 extends Decorator {
public ConcreteDecorator1(Component component) {
super(component);
}
private void method1() {
}
@Override
public void operate() {
method1();
super.operate();
}
}
public class ConcreteDecorator2 extends Decorator {
public ConcreteDecorator2(Component component) {
super(component);
}
private void method2() {
}
@Override
public void operate() {
method2();
super.operate();
}
}
场景类
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
component = new ConcreteDecorator1(component);
component = new ConcreteDecorator2(component);
component.operate();
}
}