装饰模式

113 阅读2分钟

目的

为了对某个类的功能进行增强

定义

动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活;是一种对象结构型模式。

结构

  • component:抽象组件(抽象被装饰者类,约定接口)
  • concreteCompnent:具体组件(具体被装饰者,实现抽象组件约定的方法)
  • decorator:抽象装饰类,持有被装饰类的引用
  • concreteDecorator:具体装饰类,实现对被装饰类功能的增强

demo

component

public interface Component {
    //定义被装饰对象的接口
    void say();
}

concreteComponent

//具体的会被加强的组件,有简单实现
public class ConcreteComponent implements Component{
    @Override
    public void say() {
        System.out.println("简单实现");
    }

}

decorator

//定义抽象装饰类
public class Decorator implements Component {
    protected Component component; //定义为protected可以让子类使用

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void say() {
        //委派给组件
        component.say();
    }
}

concreteDecorator

public class ConcreteDecoratorA extends Decorator {
    //父类没有默认构造方法时,子类不会自动生成默认构造方法
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void say() {
        component.say();
        enhance();
    }
    public void enhance() {
        System.out.println("这是包装A的增强功能");
    }
}
public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void say() {
        component.say();
        enhance();
    }

    public void enhance() {
        System.out.println("这是b装饰类的增强");
    }
}
public class Client {
    public static void main(String[] args) {
        Component component = new ConcreteDecoratorA(new ConcreteComponent());
        component.say();
        Component componentb = new ConcreteDecoratorB(component);
        componentb.say();
    }
}

具体组件被具体装饰类增强,具体装饰类也可以作为组件被另外的具体装饰类增强

优点

  • 扩展对象功能相对继承而言更加灵活
  • concreteComponent与concreteDecorator可以独立变化无需修改现有代码,符合开闭原则。

缺点

  • 会产生较多的装饰类
  • 灵活的代价会造成系统复杂,相对继承而言更加难以排错

总结

在不影响其他类的情况下给对象增加新的职责