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

前言

今天,咱們來說講Android中的裝飾模式,還有高級UI+Gradle+RxJava+小程序+Hybrid+移動架構+React Native+性能優化+flutter+kotlin+NDK等技術教程不按期分享,關注我第一時間學習java

裝飾模式(Decorator Pattern):也能夠稱爲包裝模式(Wrapper Pattern),它動態給一個對象增長額外的職責,就增長對象功能來講,裝飾模式比生成子類實現更爲靈活,它是一種對象結構型模式git

裝飾模式是一種用於替代繼承的技術,經過一種無須定義子類的方式給對象動態增長職責,使用對象間的關聯關係替代繼承關係 !Android中的裝飾模式:一文讓你瞭解這個用於替代繼承的技術!github

  • 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地址:https://github.com/Meng997998/AndroidJX點下star

相關文章
相關標籤/搜索