|
一、開篇
上一篇我們講述了結(jié)構(gòu)型模式中的代理模式。本篇,我們將會開始講述行為型模式中的命令模式,在設(shè)計模式的這些基本的模式完成后,我將會將一些經(jīng)常用的其他的一些擴(kuò)展的模式進(jìn)行講解,希望能夠引起大家的共鳴。
我們先來看看命令模式的定義吧:
命令模式是將一類對象的功能操作進(jìn)行抽象,一般來說,這些對象有相同的方法,所以這類對象有著類似的操作,我們通過抽象,就可以定義出一個命令對象,通過這樣的方式,用戶程序在使用的時候,只與該命令對象打交道,而不用與一類對象打交道,降低了耦合性,提高了程序設(shè)計的靈活性。
命令模式適應(yīng)于一組對象他們的操作形式非常的類似,這個時候我們可以把對象的行為進(jìn)行抽象,抽象成命令對象,實現(xiàn)解耦,下面來舉例說明:
例如我這里要實現(xiàn)多數(shù)據(jù)的保存操作,例如支持SQLServer與Oracle數(shù)據(jù)庫,還有Access數(shù)據(jù)庫,那么假設(shè)我這里定義相關(guān)的CRUD方法如下:
對于上述的方法,可能我們?yōu)槊總€數(shù)據(jù)庫定義了自己的相應(yīng)的數(shù)據(jù)庫操作命令方法,例如我們都定義為Create方法,Update方法,Delete方法,Retrieve方法(查詢數(shù)據(jù))。
那么我們可以抽象出一個公共的命令對象,定義這樣的命令抽象對象:
本篇以此為題目展開,來講述命令模式的完整實現(xiàn),可能功能還不是很完善,但是希望大家能夠看出命令模式解決的問題及解決問題的思路,如果我某個地方表述有誤或者說表達(dá)的不清楚,請大家指出批評,并謝謝大家的意見和建議。
二、摘要
本篇將以多數(shù)據(jù)訪問支持來題目來講述命令模式的用法,可能部分功能沒有講到或者提到,還請大家補(bǔ)充,由于本文都是個人對命令模式的理解,可能部分觀點還存在理解上的偏差,或者不深入,還請大家批評指出。
本文將從下面的幾個內(nèi)容展開說明:
1、命令模式的使用場景
2、命令模式的經(jīng)典實現(xiàn)。
3、命令模式的其他應(yīng)用。
4、總結(jié)命令模式。
我們看看經(jīng)典的命令模式的類圖吧,對比下經(jīng)典命令模式的,我們下面給出命令模式的其他應(yīng)用場景。
三、本文大綱
a、開篇。
b、摘要。
c、本文大綱。
d、命令模式的特點及使用場景。
e、命令模式的其他方案。
f、命令模式使用總結(jié)。
g、系列進(jìn)度。
h、下篇預(yù)告。
四、命令模式的特點及使用場景
我們來分析下命令模式的使用場景吧,一般情況下如下幾類場景中使用命令模式會達(dá)到很好的效果:
1、當(dāng)一個應(yīng)用程序調(diào)用者與多個目標(biāo)對象之間存在調(diào)用關(guān)系時,并且目標(biāo)對象之間的操作很類似的時候。
2、例如當(dāng)一個目標(biāo)對象內(nèi)部的方法調(diào)用太復(fù)雜,或者內(nèi)部的方法需要協(xié)作才能完成對象的某個特點操作時。
3、有時候調(diào)用者調(diào)用目標(biāo)對象后,需要回調(diào)一些方法。
對于上圖中的靜態(tài)對象,我們來進(jìn)行解釋下,并且我們必須深入理解這幾個對象的含義。
Invoker:調(diào)用者對象。
Receiver:接收調(diào)用者請求執(zhí)行操作的目標(biāo)對象。
ICommand:用于解耦目標(biāo)對象與調(diào)用者之間的抽象命令對象。
下面我們來分析下上面講述的CRUD的經(jīng)典命令模式的實現(xiàn):
1、定義SQLServer的CRUD的簡單實現(xiàn)示例代碼:
這里補(bǔ)上DO方法:
2、CRUD的ICommand接口定義:
我們這里定義的Receiver定義成枚舉類型的對象,來枚舉SQLserver執(zhí)行的具體的操作。
通過上面我們給出了命令模式的一個經(jīng)典的實現(xiàn)方案。下面我們來看看其他的解決方案。在實際的項目中,可能我們很少會設(shè)置上面的Receiver對象的,也很少把他作為command的一個屬性放在接口中。我們更習(xí)慣將Receiver對象作為ICommand中通用接口方法的一個變量傳入給目標(biāo)對象。當(dāng)然不同的場景決定了不同的模式用法。通過經(jīng)典的方案,我們能夠看出命令模式的用法。
五、命令模式的其他實現(xiàn)方案
一、輕量級的事件隊列
考慮如下場景,如果我們可能在某個調(diào)用者在執(zhí)行一個動作時,我們不想調(diào)用者了解那么多的細(xì)節(jié)和內(nèi)部的交互,并且調(diào)用者的這個方法調(diào)用了很多目標(biāo)對象的不同方法,來協(xié)作完成一些操作。這些目標(biāo)對象的方法要么順序有限制,要么無順序的限制等。
1、創(chuàng)建3個類,每個類都有自身的成員方法輸出一段字符串。
二、異步命令
考慮現(xiàn)實我們在開發(fā)的過程中經(jīng)常會遇到這樣的場景吧:我們需要執(zhí)行一個時間特別長的任務(wù),如果我們將這個長任務(wù)與其他的任務(wù)一起采用同步執(zhí)行的方式,客戶的體驗不好,例如我們在下載的時候,如果我們能做到異步的方式的話,后臺執(zhí)行文件下載的操作,前臺用戶可以繼續(xù)執(zhí)行其他的操作,而不是等待下載完畢,才能繼續(xù)操作。這個時候,我們可能通過異步命令的方式來操作,效果肯定會更好。不然也不會出現(xiàn)那么多的異步編程的思想了。
下面我們通過命令模式來實現(xiàn)異步命令模式:
上面給出了異步的調(diào)用方式,通過上面的這樣的代碼形式,就能完成異步的訪問。
上面實體的內(nèi)容可以改進(jìn)成為,通過統(tǒng)一添加的方式來注冊事件。
六、命令模式使用總結(jié)
通過上面的講解我想大家應(yīng)該對命令模式有了一定的了解,命令模式就是將一組對象的相似行為,進(jìn)行了抽象,將調(diào)用者與被調(diào)用者之間進(jìn)行解耦,提高了應(yīng)用的靈活性。命令模式將調(diào)用的目標(biāo)對象的一些異構(gòu)性給封裝起來,通過統(tǒng)一的方式來為調(diào)用者提供服務(wù)。
相信大家通過實戰(zhàn)能夠體會該模式的好處。
it知識庫:系統(tǒng)架構(gòu)技能之設(shè)計模式—命令模式,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。