題目:寫乙個給人搭配不同服飾的系統,就是那種可以換各種各樣衣服褲子的個人形象系統。簡單點,用控制台實現。
第一版:
public功能是實現了,但如果要增加「超人」的裝扮,就需要修改「person」類,這違背了「開放封閉原則」。所以應該把這些服飾類都寫成子類。class
person
public
void
wearshoes()
public
void
wearjeans()
public
void
wearshirts()
public
void
weartie()
public
void
show()
public
static
void
main(string args)
}
第二版:
**結構圖
}現在**確實做到了「服飾」類與「人」類的分離,但還是有問題存在。這是乙個乙個拼湊出來的。應該在內部組裝完畢,然後再顯示出來,這有點像建造者模式,但卻不是。建造者模式要求建造的過程是穩定的,而我們這個例子建造過程不是穩定的。通過服飾組合出乙個有個性的人完全有無數種方式,並非是固定的。我們需要把所需的功能按正確的順序串聯起來進行控制,這可以用乙個有意思的設計模式來實現-裝飾模式。
裝飾模式:動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
裝飾模式結構圖
裝飾模式是利用decorator來對物件進行包裝的。這樣每個物件的實現就和如何使用這個物件分離開了,每個裝飾物件只關心自己的功能,不需要關心如何被新增到物件鏈中。
那如何用裝飾模式改寫上面的例子呢?這裡得注意一下,如果只有乙個concretecomponent類而沒有抽象的component類,那麼decorator類就可以是concretecomponent的乙個子類。同樣的道理,如果只有乙個concretedecorator類,就沒必要建立乙個decorator類,而可以把decorator和concretedecorator的責任合併成乙個類。
第三版:
**結構圖
component類
publicconcretecomponent類abstract
class
component
publicdecorator類class person3 extends
component
public
void
show()
public
static
void
main(string args)
}
publicconcretedecorator類class finery3 extends
component
public
void
decorate(component component)
public
void
show()}}
publicclass tie3 extends
finery3
public
void
show()
}
public從person3類的main方法可以看到,現在我們可以靈活的搭配服飾了。class tshirts3 extends
finery3
public
void
show()
}
總結:裝飾模式是為已有功能動態地新增更多功能的一種方式。那到底什麼時候該用它呢?在起初的設計中,當系統需要新功能時,是向舊的類中新增新的**,這些新**通常裝飾了原有類的核心職責或主要行為。但這種做法問題在於增加了主類的複雜度,而新加入的東西僅僅是為了滿足一些只在特定條件下才會執行的行為的需要。而裝飾模式提供了一種非常好的解決方案,它把要裝飾的功能單獨地放在乙個類中,並讓裝飾類包裝它所要裝飾的物件,因此,當需要執行特殊行為的時候,客戶**就可以在執行的時候根據需要有選擇地、按順序地使用裝飾功能包裝物件了。這樣做最大的好處就是把類的核心職責和裝飾功能區分開了,而且可以去除相關類中重複的裝飾邏輯。
設計模式之裝飾設計模式
1.目的 動態擴充套件類的行為 開閉原則 對擴充套件開放,對修改關閉 2.要點 裝飾類和被裝飾類都實現同乙個介面或者繼承同乙個類 3.具體實現 被裝飾元件介面 被裝飾元件實現類實現 抽象類構建被裝飾元件實現被裝飾元件介面 裝飾類繼承抽象類 裝飾類 重寫抽象類方法 裝飾 4.例項 被裝飾類介面 pub...
設計模式之裝飾模式
有時如果需要對某乙個類增加乙個功能,可以使用繼承來實現。但是如果想要只是對某乙個物件來增加一項功能,則可能會用到裝飾模式。裝飾模式的主要作用是動態的給某乙個物件新增某些功能。如果此時使用繼承來新增功能時,會產生大量的子類,導致難以維護。裝飾模式的簡要類圖如下 其中 component為待增加功能 即...
設計模式之裝飾模式
template pattern 即模板模式 核心思想 產品不變的部分首先實現,將易變的部分抽象出來供子類完成。例如 一雙運動鞋大體製作流程各廠家基本一致,但是各環節實現細節可有些不一樣,不一樣的部分抽象出來讓不同廠家實現。即先有個框架,細節交給不同廠家實現 程式設計例項 趙本山小品中提到的將大象裝...