Android中的裝飾模式:一文讓你瞭解這個用於替代繼承的技術!

yilian發表於2020-01-10

前言

今天,我們來講講Android中的裝飾模式,還有高階UI+Gradle+RxJava+小程式+Hybrid+移動架構+React Native+效能最佳化+flutter+kotlin+NDK等技術教程不定期分享,關注我第一時間學習

裝飾模式(Decorator Pattern):也可以稱為 包裝模式(Wrapper Pattern),它動態給一個物件增加額外的職責,就增加物件功能來說,裝飾模式比生成子類實現更為靈活,它是一種 物件結構型模式

裝飾模式是一種用於替代繼承的技術,透過一種無須定義子類的方式給物件動態增加職責,使用物件間的關聯關係替代繼承關係 !

Android中的裝飾模式:一文讓你瞭解這個用於替代繼承的技術!
  • Component(抽象元件類)
    具體元件類和抽象裝飾類共同父類,宣告瞭具體元件中需要實現的方法,它的引入可以使呼叫者以一致的方式處理未裝飾物件和裝飾物件,實現呼叫者的透明操作

  • ConcreteComponent(具體元件類) 實現抽象元件類的宣告的方法

  • Decorator(抽象裝飾類) 用於增加具體元件的職責,它的子類實現具體職責,它持有一個具體元件類的引用,透過該引用可以呼叫未裝飾前的方法,並透過子類擴充套件該方法

  • ConcreteDecorator(具體裝飾類) 給具體元件類增加新方法

Android中的裝飾模式:一文讓你瞭解這個用於替代繼承的技術!

平時生活中,有很多需要送禮物的時候,一個好禮物更需要好包裝來襯托,但是有時候買的禮物只有一個很醜陋的盒子,以裝飾模式實現包裝禮物的需求:

Component 類:

public abstract class Gift {       /**
     * 禮物包裝
     */
    public abstract void packaging();
}

ConcreteComponent 類:

public class BirthdayGift extends Gift {    @Override
    public void packaging() {                LogUtils.i("包裝盒");
    }
}

Decorator 類:

public abstract class GiftPackaging extends Gift {    private Gift gift;    public GiftPackaging(Gift gift) {                this.gift = gift;
    }    public void packaging() {
        gift.packaging();
    }
}

ConcreteDecorator 類:

// 簡易包裝public class SimplePackaging extends GiftPackaging {        public SimplePackaging(Gift gift) {              super(gift);
    }            @Override
    public void packaging() {             super.packaging();
        addColorSheet();
    }    private void addColorSheet() {
        LogUtils.i("包彩紙");
    }} // 奢華包裝 public class LuxuryPackaging extends GiftPackaging {        public LuxuryPackaging(Gift gift) {                super(gift);
    }          @Override  public void packaging() {                super.packaging();
        addColorSheet();
        addRibbon();
        addCard();
        addGiftBox();
    }        private void addColorSheet() {
        LogUtils.i("包彩紙");
    }    private void addRibbon() {
        LogUtils.i("加綵帶");
    }    private void addCard() {
        LogUtils.i("加賀卡");
    }    private void addGiftBox() {
        LogUtils.i("加禮盒");
    }
}

Client 類:

// 簡易包裝的禮物Gift gift = new BirthdayGift();Gift giftPackaging = new SimplePackaging(gift);
giftPackaging.packaging();// 奢華包裝的禮物Gift gift = new BirthdayGift();Gift giftPackaging = new LuxuryPackaging(gift);
giftPackaging.packaging();

透明裝飾模式

上面實現的裝飾模式叫做透明裝飾模式,客戶端可以完全針對抽象程式設計,裝飾模式的透明性要求客戶端不應該將物件型別宣告為 具體元件型別或者 具體裝飾型別,需要全部宣告為 抽象元件型別,對於客戶端呼叫來說, 具體元件物件具體裝飾物件是一樣的,沒有任何區別,可以一致處理這些物件,實現透明裝飾模式時,要求 具體裝飾類的 operation() 方法覆蓋 抽象裝飾類的 operation() 方法,除了呼叫 具體元件類的 operation() 方法外,還需要呼叫新增的 addedBehavior() 方法來增加新職責。

透明模式可以對一個已裝飾的物件再進行裝飾,獲得更復雜,功能更強大的物件。

半透明裝飾模式

有透明裝飾模式,就有對應的半透明裝飾模式,有時我們需要單獨呼叫新增方法,就不得不把物件宣告為 具體裝飾型別具體元件物件還是可以繼續定義為 抽象元件型別,這就是半透明裝飾模式。

還是拿上面的栗子來說,如果包裝禮物只想用絲帶和彩紙包裝或者再加一個禮袋,用半透明模式就會非常方便靈活,直接呼叫對應的方法就可以了,但是客戶端需要區別對待裝飾前後的物件

優點

  • 利用關聯關係替代繼承關係,更加靈活,不會導致類個數急劇增加

  • 透明裝飾模式可以對一個物件進行多次裝飾,透過使用不同的具體裝飾類的組合,能得到功能更加強大的物件

  • 具體元件類和具體裝飾類可以獨立變化,根據需求,在不變原來程式碼得基礎上,增加這兩個類,很符合“開閉原則”

缺點

  • 既然是更加靈活的解決方法,出錯的機率也隨之變大,排查錯誤的困難也跟著變大

設計模式相關的面試題大家也可以瞭解一下: Android面試輕鬆搞定設計模式:六大原則+三大分類+詳細總結

還有BATJ、位元組跳動面試專題,演算法專題,高階技術專題,混合開發專題,java面試專題,Android,Java小知識,到效能最佳化.執行緒.View.OpenCV.NDK等已經上傳到了的我的GitHub

大家點選我的GitHub地址: 點下star


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2672835/,如需轉載,請註明出處,否則將追究法律責任。

相關文章