Android中的裝飾模式:一文讓你瞭解這個用於替代繼承的技術!
前言
今天,我們來講講Android中的裝飾模式,還有高階UI+Gradle+RxJava+小程式+Hybrid+移動架構+React Native+效能最佳化+flutter+kotlin+NDK等技術教程不定期分享,關注我第一時間學習
裝飾模式(Decorator Pattern):也可以稱為 包裝模式(Wrapper Pattern),它動態給一個物件增加額外的職責,就增加物件功能來說,裝飾模式比生成子類實現更為靈活,它是一種 物件結構型模式。
裝飾模式是一種用於替代繼承的技術,透過一種無須定義子類的方式給物件動態增加職責,使用物件間的關聯關係替代繼承關係 !
-
Component(抽象元件類)
具體元件類和抽象裝飾類共同父類,宣告瞭具體元件中需要實現的方法,它的引入可以使呼叫者以一致的方式處理未裝飾物件和裝飾物件,實現呼叫者的透明操作 -
ConcreteComponent(具體元件類) 實現抽象元件類的宣告的方法
-
Decorator(抽象裝飾類) 用於增加具體元件的職責,它的子類實現具體職責,它持有一個具體元件類的引用,透過該引用可以呼叫未裝飾前的方法,並透過子類擴充套件該方法
-
ConcreteDecorator(具體裝飾類) 給具體元件類增加新方法
平時生活中,有很多需要送禮物的時候,一個好禮物更需要好包裝來襯托,但是有時候買的禮物只有一個很醜陋的盒子,以裝飾模式實現包裝禮物的需求:
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2672835/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於繼承,你瞭解多少?繼承
- 深入瞭解JavaScript中基於原型(prototype)的繼承機制JavaScript原型繼承
- 一文帶你瞭解HDFS技術
- ES6中的類繼承和ES5中的繼承模式詳解繼承模式
- 在java的繼承中你是否有這樣的疑惑?Java繼承
- 擴充套件類的三種方式(繼承,裝飾模式,動態代理)套件繼承模式
- 初步瞭解 JS 繼承JS繼承
- 【設計模式】如何用組合替代繼承設計模式繼承
- 瞭解這幾個大資料應用案例,讓你更瞭解大資料!大資料
- 瞭解一下JavaScript繼承的方法JavaScript繼承
- Android2017 這些技術 —— 你都瞭解過嗎Android
- 繼承&修飾符繼承
- c# 中的封裝、繼承、多型詳解C#封裝繼承多型
- C++繼承時的修飾符C++繼承
- 這一次讓你徹底瞭解 Android Frame AnimationAndroid
- 這一次讓你徹底瞭解 Android Tween AnimationAndroid
- 瞭解這12個概念,讓你的JavaScript水平更上一層樓JavaScript
- 設計模式——從HttpServletRequestWrapper瞭解裝飾者模式設計模式HTTPServletAPP
- RecyclerView中裝飾者模式應用View模式
- 瞭解python的裝飾器特性Python
- JavaScript中class繼承超乎你的想象《一》JavaScript繼承
- 一文帶你瞭解python中的多型Python多型
- 一篇文章讓你瞭解Android各個版本的歷程Android
- JavaScript中的繼承JavaScript繼承
- PostgreSQL中的繼承SQL繼承
- JS中的繼承JS繼承
- java中的繼承Java繼承
- JAVA中的註解可以繼承嗎?Java繼承
- 設計模式:裝飾者模式介紹及程式碼示例 && JDK裡關於裝飾者模式的應用設計模式JDK
- 一文讓你瞭解人工智慧全貌--技術篇(建議收藏轉發)人工智慧
- Java核心技術筆記 繼承Java筆記繼承
- 三種繼承的方法:public 繼承/private繼承/protected繼承詳解及區別繼承
- 10個應該瞭解的Ruby技術
- 裝飾模式在jsp tag extension中的應用模式JS
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- Netty中的裝飾者模式Netty模式
- 最新的15個Android庫,你瞭解嗎?Android
- 10個讓你繼續幹IT的理由