1. 程式人生 > 實用技巧 >DercoratorPattern裝飾者模式

DercoratorPattern裝飾者模式

裝飾者模式

1,定義

動態的給一個物件新增一些額外的職責。

裝飾者模式通常有4個角色,就增加功能來說,裝飾者模式比生成子類更加的靈活。

Component:抽象構件。通常是一個介面或者抽象類,定義最核心最原始的物件。

public interface AbstractComponent {

    /**
     * 抽象方法
     */
    void operate();
}

ConcreteComponent:具體構件。抽象構件的實現,即被裝飾的物件。

public class Component implements AbstractComponent {

    @Override
    public void operate() {
        System.out.println("do something!");
    }
}

Decorator:抽象裝飾者角色。通常是一個抽象類,可設定一個被裝飾物件。

public abstract class Decorator implements AbstractComponent {

    /** 定義一個裝飾構件 **/
    private AbstractComponent abstractComponent;

    /**
     * 通過建構函式設定被裝飾者
     * @param abstractComponent
     */
    public Decorator(AbstractComponent abstractComponent) {
        this.abstractComponent = abstractComponent;
    }

    /**
     * 委託被裝飾著執行
     */
    @Override
    public void operate() {
        this.abstractComponent.operate();
    }
}

ConcreteDecorator:具體裝飾者角色。實現對構件的功能職責的擴充套件。

public class DecoratorOne extends Decorator {

    /**
     * 通過建構函式設定被裝飾者
     *
     * @param abstractComponent
     */
    public DecoratorOne(AbstractComponent abstractComponent) {
        super(abstractComponent);
    }

    /**
     * 定義自己的裝飾方法
     */
    private void methodOne() {
        System.out.println("DecoratorOne.methodOne 裝飾");
    }

    /**
     * 重寫被裝飾物件的方法
     */
    @Override
    public void operate() {
        this.methodOne();
        super.operate();
    }
}

public class DecoratorTwo extends Decorator {

    /**
     * 通過建構函式設定被裝飾者
     *
     * @param abstractComponent
     */
    public DecoratorTwo(AbstractComponent abstractComponent) {
        super(abstractComponent);
    }

    /**
     * 定義自己的裝飾方法
     */
    private void methodTwo() {
        System.out.println("DecoratorTwo.methodTwo 裝飾");
    }

    /**
     * 重寫被裝飾物件的方法
     */
    @Override
    public void operate() {
        super.operate();
        this.methodTwo();
    }
}

場景類

public class Client {

    public static void main(String[] args) {
        /** 定義被裝飾著 **/
        AbstractComponent component = new Component();

        /** 第一次裝飾 **/
        component = new DecoratorOne(component);

        /** 第二次裝飾 **/
        component = new DecoratorTwo(component);

        component.operate();
    }
}

2.應用

2.1 優點

  • 裝飾者及被裝飾者相互獨立,兩者解耦,提高系統的靈活性。
  • 裝飾者模式是繼承關係的替代方案,且不論被裝飾多少層,返回的物件仍然是該被裝飾者。
  • 裝飾者模式可以動態的擴充套件一個實現類的功能。

2.2 缺點

  • 多層裝飾會增加實現類的複雜度,減少裝飾類的數量可以降低系統的複雜度。

2.3 使用場景

  • 動態的為一個物件增加功能,且可以動態的撤銷。
  • 為一批實現類改裝或加裝功能。