天天看點

Java設計模式 - 結構型模式 - 裝飾模式

介紹

裝飾模式(Decorator Pattern)也稱為包裝模式,動态的給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。

優缺點

優點

裝飾類和被裝飾類可以獨立發展,不會互相耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動态擴充一個實作類的功能。

缺點

多層裝飾比較複雜

使用場景

1.擴充一個類的功能。 2.動态增加功能,動态撤銷。

舉例

該模式包含角色

抽象元件類

/**
 * 抽象元件類
 */
public abstract class Component {
    /**
     * 抽象方法
     */
    public abstract void operate();
}
           

元件具體實作類

/**
 * 元件具體實作類
 */
public class ConcreteComponent extends Component{
    @Override
    public void operate() {
        // 具體邏輯
        System.out.println("元件具體實作類operate");
    }
}
           

抽象裝飾者類

/**
 * 抽象裝飾者類
 */
public abstract class Decorator extends Component{
    private Component component;
    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operate() {
        System.out.println("抽象裝飾者operate");
        component.operate();
    }
}
           

裝飾者具體實作類

/**
 * 裝飾者具體實作類
 */
public class ConcreteDecoratorA extends Decorator{
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        super.operate();
        System.out.println("裝飾者具體實作類operate");
        operateA();
    }

    /**
     * 自定義裝飾方法A
     */
    private void operateA(){
        System.out.println("自定義裝飾方法operateA");
    }
}
           

用戶端調用類

/**
 * 用戶端調用類
 */
public class Client {

    public static void main(String[] args) {
        // 構造元件對象
        Component component = new ConcreteComponent();
        // 構造裝飾者對象并調用,此時相當于給元件對象增加裝飾者A的功能方法
        Decorator decorator = new ConcreteDecoratorA(component);
        decorator.operate();
    }
}
           

繼續閱讀