近年來,大家都開始注意設計模式。那么,到底我們為什么要用設計模式呢?這么多設計模式為什么要這么設計呢?說實話,以前我還真沒搞清楚。就是看大家一口一個"Design pattern",心就有點發虛。于是就買了本"四人幫"的設計模式,結果看得似懂非懂:看得時候好像是懂了,過一會就忘了。可能是本人比較"愚鈍"吧:))最近,有了點感悟。"獨樂不如眾樂",與大家分享一下,還望指教!
??? 為什么要提倡"Design Pattern"呢?根本原因是為了代碼復用,增加可維護性。那么怎么才能實現代碼復用呢?OO界有前輩的幾個原則:"開-閉"原則(Open Closed Principal)、里氏代換原則、合成復用原則。設計模式就是實現了這些原則,從而達到了代碼復用、增加可維護性的目的。
??? 一、"開-閉"原則
??? 此原則是由"Bertrand Meyer"提出的。原文是:"Software entities should be open for extension,but closed for modification"。就是說模塊應對擴展開放,而對修改關閉。模塊應盡量在不修改原(是"原",指原來的代碼)代碼的情況下進行擴展。那么怎么擴展呢?我們看工廠模式"factory pattern":假設中關村有一個賣盜版盤和毛片的小子,我們給他設計一"光盤銷售管理軟件"。我們應該先設計一"光盤"接口。如圖:
[pre]______________
|<<inte***ce>>|
| 光盤??????? |
|_____________|
|+賣()??????? |
|???????????? |
|_____________|[/pre]
而盜版盤和毛片是其子類。小子通過"DiscFactory"來管理這些光盤。代碼為:
public class DiscFactory{
??? public static 光盤 getDisc(String name){
?????? return (光盤)Class.forName(name).getInstance();
??? }
}
有人要買盜版盤,怎么實現呢?
public class 小子{
??? public static void main(String[] args){
??????? 光盤 d=DiscFactory.getDisc("盜版盤");
??????? 光盤.賣();
??? }
}
??? 如果有一天,這小子良心發現了,開始賣正版軟件。沒關系,我們只要再創建一個"光盤"的子類"正版軟件"就可以了。不需要修改原結構和代碼。怎么樣?對擴展開發,對修改關閉。"開-閉原則"
??? 工廠模式是對具體產品進行擴展,有的項目可能需要更多的擴展性,要對這個"工廠"也進行擴展,那就成了"抽象工廠模式"。
??? 二、里氏代換原則
里氏代換原則是由"Barbara Liskov"提出的。如果調用的是父類的話,那么換成子類也完全可以運行。比如:
?????? 光盤 d=new 盜版盤();
?????? d.賣();
??? 現在要將"盜版盤"類改為"毛片"類,沒問題,完全可以運行。Java編譯程序會檢查程序是否符合里氏代換原則。還記得java繼承的一個原則嗎?子類overload方法的訪問權限不能小于父類對應方法的訪問權限。比如"光盤"中的方法"賣"訪問權限是"public",那么"盜版盤"和"毛片"中的"賣"方法就不能是package或private,編譯不能通過。為什么要這樣呢?你想啊:如果"盜版盤"的"賣"方法是private。那么下面這段代碼就不能執行了:
??????????? 光盤 d=new 盜版盤();
??????????? d.賣();
可以說:里氏代換原則是繼承復用的一個基礎。
??? 三、合成復用原則
??? 就是說要少用繼承,多用合成關系來實現。我曾經這樣寫過程序:有幾個類要與數據庫打交道,就寫了一個數據庫操作的類,然后別的跟數據庫打交道的類都繼承這個。結果后來,我修改了數據庫操作類的一個方法,各個類都需要改動。"牽一發而動全身"!面向對象是要把波動限制在盡量小的范圍。
??? 在Java中,應盡量針對Inte***ce編程,而非實現類。這樣,更換子類不會影響調用它方法的代碼。要讓各個類盡可能少的跟別人聯系,"不要與陌生人說話"。這樣,城門失火,才不至于殃及池魚。擴展性和維護性才能提高
??? 理解了這些原則,再看設計模式,只是在具體問題上怎么實現這些原則而已。張無忌學太極拳,忘記了所有招式,打倒了"玄冪二老",所謂"心中無招"。設計模式可謂招數,如果先學通了各種模式,又忘掉了所有模式而隨心所欲,可謂OO之最高境界。呵呵,搞笑,搞笑!
這是我的一點心得,大家可能理解得更深刻。還望指教!
??? 為什么要提倡"Design Pattern"呢?根本原因是為了代碼復用,增加可維護性。那么怎么才能實現代碼復用呢?OO界有前輩的幾個原則:"開-閉"原則(Open Closed Principal)、里氏代換原則、合成復用原則。設計模式就是實現了這些原則,從而達到了代碼復用、增加可維護性的目的。
??? 一、"開-閉"原則
??? 此原則是由"Bertrand Meyer"提出的。原文是:"Software entities should be open for extension,but closed for modification"。就是說模塊應對擴展開放,而對修改關閉。模塊應盡量在不修改原(是"原",指原來的代碼)代碼的情況下進行擴展。那么怎么擴展呢?我們看工廠模式"factory pattern":假設中關村有一個賣盜版盤和毛片的小子,我們給他設計一"光盤銷售管理軟件"。我們應該先設計一"光盤"接口。如圖:
[pre]______________
|<<inte***ce>>|
| 光盤??????? |
|_____________|
|+賣()??????? |
|???????????? |
|_____________|[/pre]
而盜版盤和毛片是其子類。小子通過"DiscFactory"來管理這些光盤。代碼為:
public class DiscFactory{
??? public static 光盤 getDisc(String name){
?????? return (光盤)Class.forName(name).getInstance();
??? }
}
有人要買盜版盤,怎么實現呢?
public class 小子{
??? public static void main(String[] args){
??????? 光盤 d=DiscFactory.getDisc("盜版盤");
??????? 光盤.賣();
??? }
}
??? 如果有一天,這小子良心發現了,開始賣正版軟件。沒關系,我們只要再創建一個"光盤"的子類"正版軟件"就可以了。不需要修改原結構和代碼。怎么樣?對擴展開發,對修改關閉。"開-閉原則"
??? 工廠模式是對具體產品進行擴展,有的項目可能需要更多的擴展性,要對這個"工廠"也進行擴展,那就成了"抽象工廠模式"。
??? 二、里氏代換原則
里氏代換原則是由"Barbara Liskov"提出的。如果調用的是父類的話,那么換成子類也完全可以運行。比如:
?????? 光盤 d=new 盜版盤();
?????? d.賣();
??? 現在要將"盜版盤"類改為"毛片"類,沒問題,完全可以運行。Java編譯程序會檢查程序是否符合里氏代換原則。還記得java繼承的一個原則嗎?子類overload方法的訪問權限不能小于父類對應方法的訪問權限。比如"光盤"中的方法"賣"訪問權限是"public",那么"盜版盤"和"毛片"中的"賣"方法就不能是package或private,編譯不能通過。為什么要這樣呢?你想啊:如果"盜版盤"的"賣"方法是private。那么下面這段代碼就不能執行了:
??????????? 光盤 d=new 盜版盤();
??????????? d.賣();
可以說:里氏代換原則是繼承復用的一個基礎。
??? 三、合成復用原則
??? 就是說要少用繼承,多用合成關系來實現。我曾經這樣寫過程序:有幾個類要與數據庫打交道,就寫了一個數據庫操作的類,然后別的跟數據庫打交道的類都繼承這個。結果后來,我修改了數據庫操作類的一個方法,各個類都需要改動。"牽一發而動全身"!面向對象是要把波動限制在盡量小的范圍。
??? 在Java中,應盡量針對Inte***ce編程,而非實現類。這樣,更換子類不會影響調用它方法的代碼。要讓各個類盡可能少的跟別人聯系,"不要與陌生人說話"。這樣,城門失火,才不至于殃及池魚。擴展性和維護性才能提高
??? 理解了這些原則,再看設計模式,只是在具體問題上怎么實現這些原則而已。張無忌學太極拳,忘記了所有招式,打倒了"玄冪二老",所謂"心中無招"。設計模式可謂招數,如果先學通了各種模式,又忘掉了所有模式而隨心所欲,可謂OO之最高境界。呵呵,搞笑,搞笑!
這是我的一點心得,大家可能理解得更深刻。還望指教!