Java設計模式之(七)——裝飾器模式


1、什么是裝飾器模式?

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible
alternative to subclassing for extending functionality.

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

說人話:一般的,我們為了擴展一個類經常使用繼承方式實現,隨着擴展功能的增多,子類會很膨脹。這時候期望在不改變類對象及其類定義的情況下,為對象添加額外功能,這就是裝飾器模式。

2、裝飾器模式定義

image-20210909082623357

①、Component抽象構件

Component是一個接口或者是抽象類, 就是定義我們最核心的對象, 也就是最原始的對象。

②、ConcreteComponent 具體構件

ConcreteComponent是最核心、 最原始、 最基本的接口或抽象類的實現, 你要裝飾的就是它。

③、Decorator裝飾角色

一般是一個抽象類, 實現接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的屬性里必然有一個private變量指向Component抽象構件。

④、ConcreteDecorator 具體裝飾角色

ConcreteDecoratorA和ConcreteDecoratorB是兩個具體的裝飾類, 你要把你最核心的、 最原始的、 最基本的東西裝飾成其他東西

3、裝飾器模式通用代碼實現

/**
 * 抽象構件
 */
public abstract class Component {
    public abstract void operator();
}
/**
 * 具體構件
 */
public class ConcreteComponent extends Component{
    @Override
    public void operator() {
        System.out.println("doSomething");
    }
}
/**
 * 抽象裝飾者
 */
public abstract class Decorator extends Component{
    private Component component;

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

    // 委托給被修飾者執行
    @Override
    public void operator() {
        this.component.operator();
    }
}
public class ConcreteDecorator1 extends Decorator{
    // 定義被修飾者
    public ConcreteDecorator1(Component component){
        super(component);
    }

    // 定義自己的修飾方法
    public void method1(){
        System.out.println("修飾方法 method1");
    }
    @Override
    public void operator() {
        this.method1();
        super.operator();
    }
}
public class ConcreteDecorator2 extends Decorator{
    // 定義被修飾者
    public ConcreteDecorator2(Component component){
        super(component);
    }

    // 定義自己的修飾方法
    public void method2(){
        System.out.println("修飾方法 method2");
    }
    @Override
    public void operator() {
        super.operator();
        this.method2();
    }
}

客戶端測試:

public class DecoratorClient {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        // 第一次修飾
        component = new ConcreteDecorator1(component);
        // 第二次修飾
        component = new ConcreteDecorator2(component);
        // 修飾后運行
        component.operator();
    }
}

打印結果:

image-20210909230652141

4、裝飾器模式優點

①、裝飾模式可以動態地擴展一個實現類的功能。

②、裝飾類和被裝飾類可以獨立發展, 而不會相互耦合。 換句話說, Component類無須知道Decorator類, Decorator類是從外部來擴展Component類的功能, 而Decorator也不用知道具體的構件。

③、裝飾模式是繼承關系的一個替代方案。 我們看裝飾類Decorator, 不管裝飾多少層, 返回的對象還是Component, 實現的還是is-a的關系

5、裝飾器模式應用場景

①、需要擴展一個類的功能, 或給一個類增加附加功能。

②、需要動態地給一個對象增加功能, 這些功能可以再動態地撤銷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM