看了《大話設計模式》pdf版的裝飾模式和其他部落格上的一些講解,第一遍很難get到講解的點在哪。經國深思,記錄下深思的結果。
裝飾模式,其實就是用遞迴的方式實現了面向切面(介面)程式設計。面向切面程式設計,可以從spring框架(aop)那裡學到,
模式用途,面向切面程式設計,在不用修改遠**的基礎上,新增新的邏輯,比如,新增使用者,adduser(user u)裡面,直接將user插入到資料表,
那麼,又有需求來了,要在插入之前記錄一些資訊,比如是誰插入的,插入的使用者名叫什麼,那麼就可以不修改adduser方法將新增的邏輯加上,可以選擇加在adduser方法的前面或者後面,都可以。
實現方法和舉例:乙個介面,兩個類,乙個是a,另乙個裝飾類b(有子類),子類位c和d。介面裡 包含需要adduser方法的宣告。兩個類都實現了這個介面。
根據《大話設計模式》中客戶端的**,可以看出最終執行的是c或者d的方法,那麼理解上就會很難,本來要a的物件去adduser,增加功能後卻是裝飾類呼叫adduser。
例子:介面people(public void eatfood();),介面中有乙個吃飯方法;
a類為peopleimpl(實現people介面,重寫eatfood()方法),
b類為decoratepeople,實現people介面,有乙個people介面引用型別的成員變數(命名為people,並完成getter和setter方法),重寫eatfood方法,該方法中判斷people是否為空,不為空則呼叫people.eatfood()。該類用於對a類進行「裝飾」
c類為femalepeople,繼承自b類,用於把a類「裝飾」成女性,c的eatfood方法先完成自己的邏輯----給食物拍照,然後再呼叫成員變數people的eatfood方法
d類為malepeople,繼承自b類,用於把a類「裝飾」成男性,d的eatfood方法先完成自己的邏輯----喝酒,然後再呼叫成員變數people的eatfood方法
準備工作做好了,那麼開始完成任務----人妖吃飯(此處宣告,下文中的「預設方法」指的是peopleimpl的eatfood方法)
1)藉口引用指向peopleimpl的物件
people ladyboy = new peopleimpl();
2)定義兩個物件,男性和女性
people female = new femalepeople();
people male = new malepeople();
3)開始裝飾
一,讓ladyboy在eatfood方法執行前執行拍照方法
female.setpeople(ladyboy);
ladyboy = female;
二,讓ladyboy在eatfood方法執行前執行喝酒
male.setpeople(ladyboy);
ladyboy = male;
任務完成。**理解:現在ladyboy指向male物件,那麼ladyboy.eatfood()會先執行自己的邏輯--喝酒,然後在呼叫成員變數的eatfood方法
,而male的成員變數是femalepeople物件(參見第三部的第二小步驟),那麼下面會呼叫femalepeople的eatfood方法,該方法先完成給食物拍照方法,再呼叫female的成員變數的eatfood;
female的成員變數是peopleimpl物件,那麼下面就執行該物件的eatfood方法
綜上,在最後,ladyboy呼叫eatfood方法,會一次執行:喝酒-》給食物拍照-》peopleimpl物件自己的eatfood方法
可以看出,已經完成了把新的邏輯加到預設eatfood方法之前的功能。
spring的aop語法中可以把乙個方法註解成預設方法執行後再執行,裝飾模式也可以,假設malepeople類的物件的eatfood寫成先執行成員變數的eatfood再執行喝酒,那麼就把喝酒放到預設方法之後了
從後往前一次數,分成兩隊,一對是先執行自己的邏輯(佇列a),一類是先執行成員變數的方法(佇列b)
那麼最終呼叫ladyboy.eatfood會按照以下順序執行
先a佇列裡的,再執行預設方法,最後執行b佇列裡的
快速理解設計模式之結構型設計模式(裝飾模式)
宣告 文章裡面某些例子只代表我個人的觀點,分享出來是希望能夠幫助大家理解設計模式,如果認為比較牽強還請手下留情,程式設計師不容易啊 在前面兩篇文章中我們講解了建立型設計模式,所謂建立就是建立物件,各種設計模式呢就是給我們建立物件提供了更好的方法,讓我們的 設計更加合理,符合oo 而不是流線式的程式設...
設計模式 裝飾模式
裝飾模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。m 超級瑪麗 普通繼承模式實現 a 發鏢 能組合出七種功能 m1 a m4 a b b 變身 m2 b m5 a c c 無敵 m3 c m6 b c m7 a b m m1 a b 組合方法 new m2 m...
設計模式 裝飾模式
剛看了看設計模式,真是費了好多的腦細胞。想著想著就到了食堂。o o哈!正是長身體的時候 大神勿噴 一定要多吃點。於是我打了乙份公尺飯,然後又端著盛公尺飯的盤子買了乙份菜 看著還不是很夠,就又端著這個盤子買了一條最愛吃的魚。裝飾模式!五一要來了。回家轉轉,沒有小外甥的玩具怎麼行。於是我去超市,推著購物...