Java設計模式 之 裝飾者模式

Java設計模式 之 裝飾者模式

假設現在有個需求是 統計組裝手機花費的時間,組件有電路板,CPU及屏幕這三個,首先我們爲三個設計個抽象類,代碼如下:

public abstract class Machine {

    // 花費的時間
    abstract int spendTime();   
}

電路板:

public class Board extends Machine {

    @Override
    int spendTime() {
        return 60;
    }

}

A11的處理器:

public class A11CPU extends Machine{

    @Override
    public int spendTime() {
        return 20;
    }

}

OLED屏幕:

public class OLEDScreen extends Machine {

    @Override
    int spendTime() {
        return 120;
    }

}

基本組件已經ok,我們可以開始組裝他們,一般來說我們比較簡單的做法,會把他們相加,代碼如下:

public class PhoneFactory {

    public static void main(String[] args) {
        Machine board = new Board();
        Machine a11CPU = new A11CPU();
        Machine oledScreen = new OLEDScreen();

        //  結果爲200
        int spendTime = board.spendTime() + a11CPU.spendTime() + oledScreen.spendTime();
    }
}

我們細細看上班的代碼,實現需求是沒有問題的,
但假設我們現在需要使用 不同組件 比如 驍龍處理器 或者 Led屏幕 或者 添加其他組裝組件 比如揚聲器 的時候時我們上述代碼擴展就很麻煩,就需要重新修改加一遍,這顯然很麻煩。

裝飾者模式實現

有沒對應的模式可以幫我們解決下?
這時候我們可以試下 裝飾者模式,我們可以看到 cpu及屏幕 是裝在電路板上的,我們是否可以電路板爲基本對象,把 cpu 和 屏幕裝 飾到電路板上面,代碼如下:

public class A11CPU extends Machine{

    private Machine machine;

    public A11CPU(Machine machine) {
        this.machine = machine;
    }

    @Override
    public int spendTime() {
        // 裝飾本地對象
        // 把時間相加
        return 20 + machine.spendTime();
    }

}
public class OLEDScreen extends Machine {

    private Machine machine;

    public OLEDScreen(Machine machine) {
        this.machine = machine;
    }

    @Override
    int spendTime() {
        // 裝飾本地對象
        // 把時間相加
        return 120 + machine.spendTime();
    }
}
public class PhoneFactory {

    public static void main(String[] args) {

        Machine machine = new Board();
        machine = new A11CPU(machine);
        machine = new OLEDScreen(machine);

        // 結果爲200
        int spendTime = machine.spendTime();
    }
}

假設電路板可以容納所以組件,把 A11處理器 換成 驍龍處理器 和 OLED 換成 LED屏 也可以較少修改代碼。

我們最後來看裝飾者模式的定義
裝飾者模式:動態將責任附加在對象上,若要擴展功能, 裝飾者提供比繼承更有彈性的替代方案

可看到我們 動態把責任寄託在 Machine machine 一個對象上,通過添加對象修飾 machine,比如在對象的內部實現相加的方法從而來豐富對象。

源碼可參看IO系列的源碼,主要是以裝飾者模式實現。

其他模式可點擊鏈接進目錄閱讀了解http://blog.csdn.net/xiao_wanzi94/article/details/78118092

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章