動態地給乙個物件新增一些額外的職責。就增加功能來說,裝飾模式相比生成子類更加靈活。
需要動態地擴充套件類的功能時
就如開頭所說,人總要穿衣服的,我們將人定義為乙個抽象類,將其穿衣的行為定義為乙個抽象方法。
public
abstract
class person
該類其實就是上面我們所提及的抽象組建類,也就是我們需要裝飾的原始物件,那麼具體裝飾誰呢?我們需要乙個具體的實現類
public
class
boyextends
person
}
boy類繼承於person類,該類僅對person中的dressed方法做了具體實現,而boy類則是我們所要修飾的具體物件,現在需要乙個裝飾者來裝飾我們的這個boy物件,這裡定義乙個personcloth類來表示人所穿著的衣服。
public
abstract
class
personcloth
extends
person
@override
public
void
dressed()
}
在personcloth類中我們保持乙個對person類的引用,可以方便地呼叫具體被裝飾物件中的方法,這也就是為什麼我們可以在不破壞原類層次結構的情況下為類增加一些功能,我們只需要在被裝飾物件的相應方法前或後增加相應的功能邏輯即可。在裝飾物只有乙個的情況下,可不必宣告乙個抽象類作為裝飾者抽象的提取,僅需定義乙個普通的類表示裝飾者即可,這裡為了表明示例我們定義兩種衣服型別,乙個類expensivecloth表示高檔衣服。
public
class
expensivecloth
extends
personcloth
//穿短袖
private
void
dressshirt()
//穿皮衣
private
void
dressleather()
//穿牛仔褲
private
void
dressjean()
@override
public
void
dressed()
}
邏輯簡單不再多說,而另乙個類checpcloth則表示便宜的衣服
public
class
checpcloth
extends
personcloth
//穿短褲
public
void
dressshorts()
@override
public
void
dressed()
}
這兩個類本質上並沒有區別,兩者都是為原本boy類中的dressed方法提供功能擴充套件,不過這種擴充套件並非是直接修改原有的方法邏輯或結構,更恰當的說,僅僅在另乙個類中將原有方法和新邏輯進行封裝整合而已。最後我們來看看客戶類中的呼叫。
public
class main
}
設計模式 外觀模式(結構性) 模板模式(結構性)
外觀模式實現的是多各類協作共同完成一件事情,因此我們使用乙個函式來封裝這些操作,將這個函式放在乙個類中 模板模式實現的是乙個類的多個函式組合完成一件事情,雖然類的每個函式可能有不同的實現方式,但是流程是一樣的。因此使用繼承方式,在類中新建乙個函式依次呼叫其他的成員函式。模板模式中將乙個大函式拆分為小...
結構性模式 享元模式
享元模式 flyweight 通過共享乙個元類 解決避免大量相同內容的小類而引起的系統開銷 物件導向的原則是一切都是物件 但如果真的這樣使用起來 那物件可能多的嚇人 例如字處理軟體 如果把每乙個字都看成乙個物件 無疑會消耗大量的記憶體 這時可以通過設計乙個元類 封裝可共享的類 另外還有一些特性取決於...
Facade外觀模式 結構性模式
1 系統的複雜度 需求 開發乙個坦克模擬系統用於模擬坦克車在各種作戰環境中的行為,其中坦克系統由引擎 控制器 車輪等各子系統構成.然後由對應的子系統呼叫.常規的設計如下 region 坦克系統組成 引擎類 public class engine public void engineactionb 車...