decorator模式
我覺得這個模式有點繞。需要很仔細的來分清其中的繼承關係。
decorator模式的使用場景:當你要描述乙個東西,比如說「人」這個東西,你回構建乙個人的class,它包括很多人的屬性,比如身高,體重,性別,年齡等等,你還有很多的施加於「人」上面的方法,比如吃飯,睡覺,跑步等等。但是,你可能希望給「人」新增一些額外的東西,就像遊戲中的人物一樣,他是帶裝備,比如「**盔甲」,「藍寶石戒指
」,「青龍大刀」。並且,遊戲中人物,你光出生的時候是啥裝備都沒有,隨著你不斷練級,你的裝備才越來越多,你還可以丟掉一些落後的裝備,這些裝備都是在遊戲中動態變化的,即它是在「執行時變化的」。你靜下來想想,如何設計「人」這個class,如果使用繼承,你顯然是無法完成的(繼承意味著你必須窮盡出所有可能的「人」的子類情況),這時候你必須使用組合。如何使用組合呢?這就是decorator模式了。
設計的時候,有3個類,第乙個為component類,它是另外2個類的父類。從component繼承來concretecomponent類,這個類為具體類。從component再繼承來decorator類,其中這個類擁有乙個成員變數,為component類物件的乙個引用。
對於「人」的設計,component就是抽象的people。concretecomponent就是具體的「人」,他包含有人的屬性(身高,體重,性別。。)。對於decorator,從它再繼承出來具體的一些裝備(「**盔甲」為乙個concretedecoratora,「藍寶石戒指」為concretedecoratorb,而「青龍大刀」為 concretedecoratorc,如果出現了乙個新的裝備,從decorator再繼承出來乙個具體的裝備類就行了)。在實際使用過程中,如果你只是使用乙個「裸人」那麼從concretecomponent就可以定義出來乙個物件。之後你想給他新增「**盔甲」,這時候你就需要使用concretedecoratora定義出乙個**盔甲的裝備,那麼人的屬性是如何體現呢?我們知道decorator擁有乙個component類物件的乙個引用的成員變數,只要這個成員變數引用乙個「人」,就是說在decorator的建構函式就要去傳入乙個「component」物件的引用。情況如下:
concretecomponent* pcom = new concretecomponent;
concretedecoratora* pdeca = new concretedecoratora(pcom);
從中可以看出,concretedecoratora本身就是描述了乙個「人」(所以要從component來繼承),還是乙個帶有某種裝備的「人」,人的屬性表現在其包含了乙個「人」物件的引用。再往下看:
concretedecoratorb* pdecb = new concretedecoratorb(pdeca);
由於pdeca本身就描述的是乙個「人」,「**盔甲的人」也可以當成引數傳入「藍寶石戒指」,(這也說明decorator要從component繼承過來),於是這個「藍寶石戒指的人」,其人的屬性表現在包含了乙個「**盔甲的人」的引用(同時這個「**盔甲的人」它的人的屬性是因為其包含乙個「人」),如果看圖的話,乙個「帶著藍寶石戒指和**盔甲的人」的結構就是:
--------------------------
| 戒指 |
| ------------------ |
| | 盔甲 | |
| | ----------- | |
| | | 具體人 | | |
| | ------- --- | |
| ----------------- | |
---------------------------
在這裡需要強調的是,concretedecorator的物件就需要當成是乙個component的物件,用上面的例子來說,雖然我們把裝備稱為「**盔甲」,但要曉得,程式中出現所有「**盔甲」的物件,都是表示「「穿**盔甲的人」」,而人的屬性就是通過包含乙個「***的人」的引用來傳遞。這就是為啥decorator的父類就是component的原因。
設計模式(5)
這篇日誌我們來介紹設計模式的一大原則 單一職責原則 單一職責原則 srp 就乙個類而言,應該僅有乙個引起他變化的原因 現在來設計俄羅斯方塊遊戲 要是我們完成這個小遊戲,我們的思路是什麼?我們一般會這樣考慮,首先他方塊下落的原理是畫四個小方塊,擦掉,然後再在下一行畫四個方塊。不斷的繪出和擦掉就形成了動...
設計模式(5) 狀態模式
允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類。它有兩種使用情況 1 乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行為。2 乙個操作中含有龐大的多分支的條件語句,且這些分支依賴於該物件的狀態。比如乙個你和心愛的那個 在軟體構建過程中,某些物件的狀態如果改...
模式設計學習(5)
今天學習下行為模式中的一種 command 命令 模式。通俗的來講,就是client需要執行一條 或一系列 命令,也可以說要發觸發乙個事件 發乙個訊息 使用該模式,則client傳送訊息時不需要知道訊息的接收者是誰。因為在command物件中,已經關聯了某條訊息的接收者。所以訊息的傳送者僅僅需要知道...