軟體設計模式(designpattern)是一套被反覆使用的**設計經驗總結。使用設計模式是為了可重用**、讓**更容易被他人理解、保證**可靠性。好的設計,成就好的作品。但在軟體設計的過程中,若有一些設計原則(design principle)的約束,那我們的軟體會重構得更好。設計模式和設計原則博大精深,需要我們長時間的實踐和總結才能真正領悟到其真諦,本章首先以「觀察者模式」為例,介紹設計模式在windows forms中的應用(其他常用設計模式略),之後詳細介紹五大設計原則(簡稱solid原則)。
程式的執行意味著模組與模組之間、物件與物件之間不停地有資料交換,觀察者模式強調的就是,當乙個目標本身的狀態發生改變時(或者滿足某一條件),它會主動發出通知,通知對該變化感興趣的其他物件,如果將通知者稱為「subject」(主體),將被通知者稱為「observer」(觀察者),具體結構圖如下:
圖9-1 觀察者模式中類關係圖
如上圖9-1所示,圖中將主體和觀察者的邏輯抽象出來兩個介面,分別為:isubject和iobserver,isubject介面中包含乙個通知觀察者的notifyobservers方法、乙個新增觀察者的addobserver方法和乙個removeobserver方法,iobserver介面中則只包含乙個接受通知的notify方法,isubject和iobserver介面的關係為:一對多,乙個主體可以通知多個觀察者。
具體**實現如下:
如上**code 9-1中所示,no.1和no.2處分別定義了isubject和iobserver介面,接著定義了乙個具體的主體類mysubject,該類實現了isubject介面,在addobserver、removeobserver分別將觀察者加入或者移除集合_observers_list(no.3和no.4處),最後在notifyobservers方法中,遍歷_observers_list集合,將通知傳送到每個觀察者(no.5處),注意我們可以在dosomething方法中當滿足某一條件時,通知觀察者(no.6處)。我們使用iobserver介面定義了兩個具體的觀察者myobserver和yourobserver,在兩者的notify方法中分別按照自己的邏輯去處理通知資訊(乙個直接將msg列印出來,乙個將msg以郵件形式傳送給別人)(no.7和no.8處)。//code 9-1
inte***ce isubject
inte***ce iobserver
class mysubject:isubject
}publicvoid removeobserver(iobserver observer)
}publicvoid notifyobservers(string msg)
}publicvoid dosomething()
}}class myobserver:iobserver
}class yourobserver:iobserver
}
現在我們可以將mysubject類物件當作乙個具體的主體,將myobserver類物件和yourobserver類物件當做具體的觀察者,那麼**中可以這樣去使用:
如上**code 9-2所示,我們向主體subject中新增兩個觀察者(no.1和no.2處),之後使用isubject.notifyobservers方法通知觀察者(no.3),另外,我們還可以使用mysubject.dosomething方法去通知觀察者(當某一條件滿足時),兩個觀察者分別會做不同的處理,乙個直接將「it's a test」字串列印輸出,而另乙個則將字串以郵件的形式傳送給別人。//code 9-2
isubject subject = new mysubject();
subject.addobserver(new myobserver());
subject.addobserver(new yourobserver());
subject.notifyobservers(「it's a test!」);
(subject as mysubject).dosomething();
注:code 9-2中,我們不能使用isubject介面去呼叫dosomething方法,而必須先將isubject型別轉換成mysubject型別,因為dosomething不屬於isubject介面。
觀察者模式中,整個流程見下圖9-2:
圖9-2 觀察者模式中的執行流程
如上圖9-2所示,在有些情況中,no.2處會做一些篩選,換句話說,主體有可能根據條件通知部分觀察者,no.4處虛線框表示可選,如果主體關心觀察者的處理結果,那麼觀察者就應該將自己的處理結果返回給主體。「觀察者模式」是所有框架使用得最頻繁的設計模式之一,原因很簡單,「觀察者模式」分隔開了框架**和框架使用者編寫的**,它是「好萊塢原則」(hollywood principle,don't call us,we will call you)的具體實現手段,而「好萊塢原則」是所有框架都嚴格遵守的。
在windowsforms框架中,可以說「觀察者模式」無處不在,在第四章講winform程式結構時已經有所說明,比如控制項處理windows訊息時,最終是以「事件」的形式去通知事件註冊者的,那麼這裡的事件註冊者就是觀察者模式中的「觀察者」,控制項就是觀察者模式中的「主體」。我們回憶一下第四章中有關system.windows.forms.control類的**(部分):
如上**code 9-3所示,在control類的wndproc視窗過程中的switch/case塊中,會根據不同的windows訊息去激發不同的事件(no.1和no.2處),由於wndproc是乙個虛方法,所有在任何乙個control的派生類中,均可以重寫wndproc虛方法,處理windows訊息,然後以「事件」的形式去通知事件註冊者。//code 9-3
class control:component
case2:
//…}
}protectedvirtual void onevent1(eventargs e)
}protectedvirtual void onevent2(eventargs e)}}
如果我們在form1中註冊了乙個button類物件btn1的click事件,那麼btn1就是觀察者模式中的「主體」,form1(的例項)就是觀察者模式中的「觀察者」,如下**:
如上圖code 9-4**所示,我們在form1的構造方法中註冊了btn1的click事件(no.1處),那麼btn1就是「主體」,form1(的例項)就是「觀察者」,當btn1需要處理windows訊息時,就會激發事件,通知form1(的例項)。//code 9-4
class form1:form
privatevoid btn1_click(object sender,eventargs e)
}
windowsforms框架正是使用「觀察者模式」實現了框架**與框架使用者編寫的**相分離。
設計模式 軟體設計原則
軟體設計六大原則 一 單一職責原則 srp 意思是就乙個類而言只有乙個改變類的起因和動機 遵循單一職責 1.可以降低類的複雜度,乙個類只負責一項職責,其邏輯肯定要比負責多項職責簡單的多 2.提高類可維護性,系統的可擴充套件性 3.變更引起的風險降低,當修改乙個功能時,可以顯著降低對其他功能的影響。二...
軟體設計原則 設計模式
定義 高層模組不能依賴底層模組,二者應該依賴其抽象 抽象不依賴細節,細節應該依賴抽象 優點 減少類之間的耦合性,提高系統穩定性 可讀性和可維護性,降低修改程式帶來的風險 定義 不要存在多於乙個導致類變更的原因,乙個類 介面 方法只負責一項職責 優點 降低類的複雜度 提高類的可讀性,提高系統的可維護性...
設計模式 軟體設計原則 開閉原則
在軟體開發中,為了提高軟體系統的可維護性和可復用性,增加軟體的可擴充套件性和靈活性,程式設計師要盡量根據6條原則來開發程式,從而提高軟體開發效率 節約軟體開發成本和維護成本。對擴充套件開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的 實現乙個熱插拔的效果。簡言之,是為了使程式的擴充套件性...