裝飾模式就是動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。對於人來說,衣服、鞋子、領帶、襪子等都是裝飾,裝飾模式就是給光著身子的人穿上各種衣服褲子。
對於程式物件來說,每乙個功能都是裝飾,給乙個類增加功能,就是給這個類進行裝飾。
compoent是乙個物件介面,可以給這些物件動態地新增職責:
class
inte***ce component
concretecomponent類,定義了乙個具體的物件,也可以給這個物件新增一些職責:
class
concretecomponent implement component
}
decorator 是裝飾抽象類,繼承了component介面,從外類來擴充套件component類的功能,但是對於component來說,是無需要知道decorator的存在的。
public
class
decorator
implements
component
//重寫operation(),實際執行的是component的operation()
@override
public
void
operation()
}}
concretedecorator 是具體的裝飾物件,起到給component新增職責的功能我們來實現一下a和b
public
class
concretedecoratora
extends
decorator
}public
class
concretedecoratorb
extends
decorator
@override
public
void
operation()
}
最後客戶端**點睛之筆:
main()
注:不一定要去構造component類,要善於變通,假如只有乙個concretecomponent(我們只修飾乙個「人」),那麼久沒有必要些component類,同時,decorator就是concretecomponent類的子類,如果concretedecorator只有乙個(「衣服」只有一件),那麼也沒有必要構造decorator,直接讓唯一的concretedecorator來繼承concretecomponent就行啦。
在這個場景下,我們給乙個人穿各種衣服,包括褲子、襪子、鞋子、衣服。
在之前的uml來說,concretecomponent可以說是代表著具體的一類人,而這個問題讓我們針對這個人,所以我們可以不用構造component類,或者說 「人」這個類就是component類。而decorator很自然就是「服裝類」,其子類就是各種衣服,那麼我們可以畫出下面的uml圖:
接著按圖來寫**:
首先是person類
class
person
private string name;
public
person
(string name)
public
abstract
void
show()
}
接著是服飾類finery:
class
finery
extends
person
@override
public
void
show()
}}
接下來就是具體服飾類concretedecorator
class
goldlianzi
extends
finery
}class
sunglasses
extends
finery
}。。。。
最後的客戶端**:
main()
結果顯示:
裝扮
thuglife帽子 香菸 大金鍊子 墨鏡 穿衣服的rikka
這樣,我們就為乙個什麼都沒有穿的人,穿上了各種衣服啦!
同理就是給類加功能。
學了這麼多,其實裝飾模式是為已有功能動態地新增更多功能的一種設計模式。
問題:在以往,在系統功能需要更新的時候,是向舊類新增新的**,這些新的**通常裝飾了原有類的核心職責或主要行為,但這種做法的問題就在於:它們在主類中加入了新的字段,新的方法和新的邏輯,從而增加了主類的複雜度。
答案:而裝飾模式提供了很好的解決方案,它把每個裝飾的功能放在單獨的類中,並讓這個類包裝它所要裝飾的物件。因此,當需要執行特殊行為時,客戶**就可以在執行時根據需要有選擇的、按順序的使用裝飾功能包裝類物件。
這樣做的更大的好處就是在於有效地把核心職責和裝飾功能區分開了,而且可以去除相關類中的重複的裝飾邏輯。
設計模式 2 23
2.工廠方法模式 工廠方法模式 參考行為模式 定義提供建立物件的方式,確保只有乙個物件被建立。意義節約資源。缺點引入了執行緒安全問題。設計 實現方法對比 實現執行緒安全 延遲載入 效能序列化 反射 餓漢式y y懶漢式 無鎖yy 懶漢式 有鎖yy 雙重檢查yy y靜態內部類yy y列舉yy y擴充套件...
淺學設計模式之狀態模式 (8 23)
狀態模式 state 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類 狀態模式是對乙個物件所處的狀態作分析。在不同的狀態下表現不同的行為。狀態模式就是對不同狀態的行為進行解耦。這裡還是舉大話設計模式的例子。就拿乙個人一天工作的行為來說吧,這個人一天有五種狀態,上午 中午 下午...
淺學設計模式之建造者模式 (6 23)
建造者模式 builder 將乙個複雜物件的構建與它的表示分離,是的同樣的構建過程可以建立不同的表示 建造者在android中,至少也是23種設計模式使用頻率能排進前三的模式了吧。因為這個模式太常用了所以我就畫個uml圖和寫寫模板 就好了 建造模式中,主要是builder為乙個建立入口,它可以通過方...