装饰设计模式

一、模式定义

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。【针对对象】

二、模式类图

装饰设计模式_第1张图片
装饰设计模式类图.jpeg

三、示例代码

public interface Component
{
     public void operate();
}
public class ConcreteComponent implements Component
{
    public void operate() 
    {
        System.out.println("do something");
    }
}
public abstract class Decorator implements Component
{
    private Component component = null;
    public Decorator(Component component)
    {
        this.component = component;
    }
    public void operate() 
    {
        this.component.operate();
    } 
}
public class ConcreteDecorator1 extends Decorator
{
    public ConcreteDecorator1(Component component)
    {
        super(component);
    }
    private void method()
    {
        System.out.println("ConcreteDecorator1 method 修饰");
    }
    public void operate()
    {
        this.method();
        super.operate();
    }
}
public class ConcreteDecorator2 extends Decorator
{
    public ConcreteDecorator1(Component component)
    {
        super(component);
    }
    private void method()
    {
        System.out.println("ConcreteDecorator2 method 修饰");
    }
    public void operate()
    {
        this.method();
        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();
    }
}

四、模式优缺点

  • 优点
    1. 装饰类与被装饰类可以独立发展,而不会相互耦合。
    2. 装饰模式是继承关系的替代方案。实现的是is-a关系
    3. 动态的扩展一个实现类的功能
  • 缺点
    1. 多层的装饰是比较复杂的

五、何时选用

  • 需要扩展一个类的功能,或给一个类增加附加功能。
  • 需要动态地给一个对象增加功能,这些功能可以再动态地撤消。
  • 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。

你可能感兴趣的:(装饰设计模式)