這篇文章主要講解了“Android中的裝飾模式介紹”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Android中的裝飾模式介紹”吧!
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括永和網(wǎng)站建設(shè)、永和網(wǎng)站制作、永和網(wǎng)頁制作以及永和網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,永和網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到永和省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
裝飾模式(Decorator Pattern):也可以稱為包裝模式(Wrapper Pattern),它動(dòng)態(tài)給一個(gè)對(duì)象增加額外的職責(zé),就增加對(duì)象功能來說,裝飾模式比生成子類實(shí)現(xiàn)更為靈活,它是一種對(duì)象結(jié)構(gòu)型模式。
裝飾模式是一種用于替代繼承的技術(shù),通過一種無須定義子類的方式給對(duì)象動(dòng)態(tài)增加職責(zé),使用對(duì)象間的關(guān)聯(lián)關(guān)系替代繼承關(guān)系 !
Component(抽象組件類)
具體組件類和抽象裝飾類共同父類,聲明了具體組件中需要實(shí)現(xiàn)的方法,它的引入可以使調(diào)用者以一致的方式處理未裝飾對(duì)象和裝飾對(duì)象,實(shí)現(xiàn)調(diào)用者的透明操作
ConcreteComponent(具體組件類) 實(shí)現(xiàn)抽象組件類的聲明的方法
Decorator(抽象裝飾類) 用于增加具體組件的職責(zé),它的子類實(shí)現(xiàn)具體職責(zé),它持有一個(gè)具體組件類的引用,通過該引用可以調(diào)用未裝飾前的方法,并通過子類擴(kuò)展該方法
ConcreteDecorator(具體裝飾類) 給具體組件類增加新方法
平時(shí)生活中,有很多需要送禮物的時(shí)候,一個(gè)好禮物更需要好包裝來襯托,但是有時(shí)候買的禮物只有一個(gè)很丑陋的盒子,以裝飾模式實(shí)現(xiàn)包裝禮物的需求:
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();
上面實(shí)現(xiàn)的裝飾模式叫做透明裝飾模式,客戶端可以完全針對(duì)抽象編程,裝飾模式的透明性要求客戶端不應(yīng)該將對(duì)象類型聲明為具體組件類型或者具體裝飾類型,需要全部聲明為抽象組件類型,對(duì)于客戶端調(diào)用來說,具體組件對(duì)象和具體裝飾對(duì)象是一樣的,沒有任何區(qū)別,可以一致處理這些對(duì)象,實(shí)現(xiàn)透明裝飾模式時(shí),要求具體裝飾類的 operation() 方法覆蓋抽象裝飾類的 operation() 方法,除了調(diào)用具體組件類的 operation() 方法外,還需要調(diào)用新增的 addedBehavior() 方法來增加新職責(zé)。
透明模式可以對(duì)一個(gè)已裝飾的對(duì)象再進(jìn)行裝飾,獲得更復(fù)雜,功能更強(qiáng)大的對(duì)象。
有透明裝飾模式,就有對(duì)應(yīng)的半透明裝飾模式,有時(shí)我們需要單獨(dú)調(diào)用新增方法,就不得不把對(duì)象聲明為具體裝飾類型,具體組件對(duì)象還是可以繼續(xù)定義為抽象組件類型,這就是半透明裝飾模式。
還是拿上面的栗子來說,如果包裝禮物只想用絲帶和彩紙包裝或者再加一個(gè)禮袋,用半透明模式就會(huì)非常方便靈活,直接調(diào)用對(duì)應(yīng)的方法就可以了,但是客戶端需要區(qū)別對(duì)待裝飾前后的對(duì)象
利用關(guān)聯(lián)關(guān)系替代繼承關(guān)系,更加靈活,不會(huì)導(dǎo)致類個(gè)數(shù)急劇增加
透明裝飾模式可以對(duì)一個(gè)對(duì)象進(jìn)行多次裝飾,通過使用不同的具體裝飾類的組合,能得到功能更加強(qiáng)大的對(duì)象
具體組件類和具體裝飾類可以獨(dú)立變化,根據(jù)需求,在不變?cè)瓉泶a得基礎(chǔ)上,增加這兩個(gè)類,很符合“開閉原則”
既然是更加靈活的解決方法,出錯(cuò)的幾率也隨之變大,排查錯(cuò)誤的困難也跟著變大
感謝各位的閱讀,以上就是“Android中的裝飾模式介紹”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Android中的裝飾模式介紹這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!