定义:动态的给一个对象添加一个额外的职责。比子类更加灵活
抽象组件AbstractComponent:定义一个抽象接口,来规范准备附加功能的类
具体组件Component:将要被附加功能的类,实现抽象构件角色接口
抽象装饰者AbstractDecorator:持有对具体构件角色的引用并定义与抽象构件角色一致的接口
具体装饰Decorator:实现抽象装饰者角色,负责对具体构件添加额外功能。
abstract class Component {
public abstract void operate();
}
class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("ConcreteComponent do st");
}
}
abstract class Decorator extends Component {
private Component component;
public Decorator(Component component){
System.out.println("==>"+component);
this.component = component;
}
@Override
public void operate() {
this.component.operate();
}
}
class ConcreteDecorator1 extends Decorator {
public ConcreteDecorator1(Component component) {
super(component);
}
@Override
public void operate() {
method1();
super.operate();
}
private void method1(){
System.out.println("method1 do st");
}
}
class ConcreteDecorator2 extends Decorator {
public ConcreteDecorator2(Component component) {
super(component);
}
@Override
public void operate() {
method2();
super.operate();
}
private void method2(){
System.out.println("method2 do st");
}
}
public class Test {
public static void main(String[] args) {
Component component = new ConcreteComponent();
component = new ConcreteDecorator1(component);
component = new ConcreteDecorator2(component);
component.operate();
}
}
优点:
装饰者类和被装饰类可以独立发展,而不会互相耦合
装饰模式是继承的一种替代方案
动态扩展一个实现类的功能
缺点:
多层装饰会使类比较复杂,增加调试难度
应用:
需要扩展一个类的功能,或给一个类增加附加功能
动态的给一个类增加功能,而且可以动态撤销
需要为一批兄弟类进行改装或加装功能。