JAVA學(xué)習(xí)筆記之 裝飾設(shè)計模式

裝飾設(shè)計模式

就是對類本身的功能進行了增強。
其實我們曾經(jīng)還學(xué)過一個東西,也可以對類的功能進行增強。

繼承。

對手機進行功能的擴展。

繼承:

定義一個基本的手機類:
Phone.java
我喜歡在接電話之前,聽會鈴聲。
請問怎么實現(xiàn)。
重寫定義一個手機類,繼承以前的手機。只不過擴展了聽彩鈴的功能。
MusicPhone.java
隨著需求的發(fā)展,我的要求又改變了,我喜歡的手機是在打完電話后,可以聽廣告的。
AdPhone.java
我的要求又提高了,我想在打電話前聽彩鈴,打電話后聽廣告。
a:繼承Phone類,自己在打電話前提供聽彩鈴功能,打電話后聽廣告功能。
b:繼承MusicPhone類,只添加聽廣告功能。
c:繼承AdPhone類,只添加聽彩鈴功能。
隨著我的需求,越來越多,我們會發(fā)現(xiàn),這個繼承結(jié)構(gòu)也越來越龐大。
繼承結(jié)構(gòu)越判斷,將來的靈活性越差。

裝飾設(shè)計模式的組成:

接口
對接口的具體實現(xiàn)
抽象裝飾類
具體裝飾類

實例:

定義一個接口:定義的是那個被裝飾的抽象的東西
Phone.java
定義一個具體的事物類:
PhoneImpl.java
定義一個抽象的裝飾類:
PhoneDecorate.java
具體的裝飾類:
鈴聲裝飾類:MusicPhoneDecorate.java
廣告裝飾類:AdPhoneDecorate.java
鈴聲和廣告裝飾類:錯誤。不用提供。

定義一個Phone接口

public interface Phone {
public abstract void call();
}

定義一個PhoneImpl具體實例

  public class PhoneImpl implements Phone {
@Override
public void call() {
    System.out.println("手機可以打電話");
}
    }

定義一個PhoneDecorate抽象的裝飾類

public abstract class PhoneDecorate implements Phone {

private Phone p;

public PhoneDecorate(Phone p) { // new PhoneImp(); new PhoneImpl2();
    this.p = p;
}

@Override
public void call() {
    this.p.call();
}
}

定義一個MusicPhoneDecorate具體的裝飾類

public class MusicPhoneDecorate extends PhoneDecorate {

public MusicPhoneDecorate(Phone p) {
    super(p);
}

@Override
public void call() {
    System.out.println("手機可以聽彩鈴");
    super.call();
}

}

定義一個AdPhoneDecorate具體的裝飾類

public class AdPhoneDecorate extends PhoneDecorate {

public AdPhoneDecorate(Phone p) {
    super(p);
}

@Override
public void call() {
    super.call();
    System.out.println("手機可以聽廣告了");
}
 }

定義一個測試類

public class PhoneDemo {
public static void main(String[] args) {
    Phone p = new PhoneImpl();
    p.call();
    System.out.println("-------------");

    PhoneDecorate pd = new MusicPhoneDecorate(p);
    pd.call();
    System.out.println("-------------");

    pd = new AdPhoneDecorate(p);
    pd.call();
    System.out.println("-------------");

    pd = new AdPhoneDecorate(new MusicPhoneDecorate(p));
    pd.call();
    System.out.println("-------------");
    
    
    
    
    pd = new MusicPhoneDecorate(new AdPhoneDecorate(p));
    pd.call();
    System.out.println("-------------");
}
}

打印結(jié)果如下:

屏幕快照 2016-12-02 17.59.28.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評論 25 708
  • 1 場景問題# 1.1 復(fù)雜的獎金計算## 考慮這樣一個實際應(yīng)用:就是如何實現(xiàn)靈活的獎金計算。 獎金計算是相對復(fù)雜...
    七寸知架構(gòu)閱讀 4,310評論 4 67
  • 一個偵探朋友向我哭訴 “你別以為我們的工作像電影那樣精彩, 我們每天就是調(diào)出監(jiān)控,看監(jiān)控,調(diào)出監(jiān)控,看監(jiān)控,像坐牢...
    留子堯閱讀 190評論 2 3
  • 大學(xué)畢業(yè)以后,一直混得很慘淡。換過好幾份工作,都不滿意。被騙過錢,也被惡人欺負過,但我從來都沒有怨恨過社會。我沒有...
    七彩祥云閱讀 531評論 0 1
  • 音階練習(xí)是作為日常訓(xùn)練非常有用的。第一,音階強化了音符音調(diào)的概念,以及他們與指板的聯(lián)系。熟悉音階有助于視奏者預(yù)先知...
    吉他微刊閱讀 4,532評論 2 1

友情鏈接更多精彩內(nèi)容