天天看點

設計模式系列-指令模式

      上一篇我們講述了結構型模式中的代理模式。本篇,我們将會開始講述行為型模式中的指令模式,在設計模式的這些基本的模式完成後,我将會将一 些經常用的其他的一些擴充的模式進行講解,希望能夠引起大家的共鳴。       我們先來看看指令模式的定義吧:       指令模式是将一類對象的功能操作進行抽象,一般來說,這些對象有相同的方法,是以這類對象有着類似的操作,我們通過抽象,就可以定義出一個 指令對象,通過這樣的方式,使用者程式在使用的時候,隻與該指令對象打交道,而不用與一類對象打交道,降低了耦合性,提高了程式設計的靈活性。       指令模式适應于一組對象他們的操作形式非常的類似,這個時候我們可以把對象的行為進行抽象,抽象成指令對象,實作解耦,下面來舉例說明:       例如我這裡要實作多資料的儲存操作,例如支援SQLServer與Oracle資料庫,還有Access資料庫,那麼假設我這裡定義相關的CRUD方法如下:       對于上述的方法,可能我們為每個資料庫定義了自己的相應的資料庫操作指令方法,例如我們都定義為Create方法,Update方法,Delete方法, Retrieve方法(查詢資料)。       那麼我們可以抽象出一個公共的指令對象,定義這樣的指令抽象對象:       本篇以此為題目展開,來講述指令模式的完整實作,可能功能還不是很完善,但是希望大家能夠看出指令模式解決的問題及解決問題的思路,如果我 某個地方表述有誤或者說表達的不清楚,請大家指出批評,并謝謝大家的意見和建議。
      本篇将以多資料通路支援來題目來講述指令模式的用法,可能部分功能沒有講到或者提到,還請大家補充,由于本文都是個人對指令模式的了解,可 能部分觀點還存在了解上的偏差,或者不深入,還請大家批評指出。       本文将從下面的幾個内容展開說明:       1、指令模式的使用場景       2、指令模式的經典實作。       3、指令模式的其他應用。       4、總結指令模式。        我們看看經典的指令模式的類圖吧,對比下經典指令模式的,我們下面給出指令模式的其他應用場景。
       a、開篇。        b、摘要。        c、本文大綱。        d、指令模式的特點及使用場景。        e、指令模式的其他方案。        f、指令模式使用總結。        g、系列進度。        h、下篇預告。
      我們來分析下指令模式的使用場景吧,一般情況下如下幾類場景中使用指令模式會達到很好的效果:       1、當一個應用程式調用者與多個目标對象之間存在調用關系時,并且目标對象之間的操作很類似的時候。       2、例如當一個目标對象内部的方法調用太複雜,或者内部的方法需要協作才能完成對象的某個特點操作時。       3、有時候調用者調用目标對象後,需要回調一些方法。       對于上圖中的靜态對象,我們來進行解釋下,并且我們必須深入了解這幾個對象的含義。       Invoker:調用者對象。       Receiver:接收調用者請求執行操作的目标對象。       ICommand:用于解耦目标對象與調用者之間的抽象指令對象。       下面我們來分析下上面講述的CRUD的經典指令模式的實作:       1、定義SQLServer的CRUD的簡單實作示例代碼:       這裡補上DO方法:       2、CRUD的ICommand接口定義:       我們這裡定義的Receiver定義成枚舉類型的對象,來枚舉SQLserver執行的具體的操作。       3、下面給出指令對象的基本實作:       4、具體的指令對象的實作:       5、調用者代碼       6、測試代碼:      通過上面我們給出了指令模式的一個經典的實作方案。下面我們來看看其他的解決方案。在實際的項目中,可能我們很少會設定上面的Receiver對象 的,也很少把他作為command的一個屬性放在接口中。我們更習慣将Receiver對象作為ICommand中通用接口方法的一個變量傳入給目标對象。當然不 同的場景決定了不同的模式用法。通過經典的方案,我們能夠看出指令模式的用法。
一、輕量級的事件隊列       考慮如下場景,如果我們可能在某個調用者在執行一個動作時,我們不想調用者了解那麼多的細節和内部的互動,并且調用者的這個方法調用了很多 目标對象的不同方法,來協作完成一些操作。這些目标對象的方法要麼順序有限制,要麼無順序的限制等。       1、建立3個類,每個類都有自身的成員方法輸出一段字元串       2、定義一個委托       3、定義調用者       4、測試代碼       5、輸出結果: 二、異步指令       考慮現實我們在開發的過程中經常會遇到這樣的場景吧:我們需要執行一個時間特别長的任務,如果我們将這個長任務與其他的任務一起采用同步執 行的方式,客戶的體驗不好,例如我們在下載下傳的時候,如果我們能做到異步的方式的話,背景執行檔案下載下傳的操作,前台使用者可以繼續執行其他的操作,而 不是等待下載下傳完畢,才能繼續操作。這個時候,我們可能通過異步指令的方式來操作,效果肯定會更好。不然也不會出現那麼多的異步程式設計的思想了。      下面我們通過指令模式來實作異步指令模式:      1、  定義指令抽象接口      2、定義異步指令接口      3、異步指令抽象的實作      上面給出了異步的調用方式,通過上面的這樣的代碼形式,就能完成異步的通路      4、實體的内容     上面實體的内容可以改進成為,通過統一添加的方式來注冊事件     具體的調用方式如下:
     通過上面的講解我想大家應該對指令模式有了一定的了解,指令模式就是将一組對象的相似行為,進行了抽象,将調用者與被調用者之間進行解耦,提 高了應用的靈活性。指令模式将調用的目标對象的一些異構性給封裝起來,通過統一的方式來為調用者提供服務。      相信大家通過實戰能夠體會該模式的好處。
        建立型         結構型         行為型         1、設計模式系列-指令模式         2、設計模式系列-觀察者模式         3、設計模式系列-政策模式         4、設計模式系列-職責模式         5、設計模式系列-模闆模式         6、設計模式系列-中介者模式         7、設計模式系列-解釋器模式
         下一篇我将會講解設計模式中的經典模式,觀察者模式,該模式是委托應用的經典代表,不熟悉委托的話,可能就會很好了解該模式。希望大家提 出寶貴意見,我将會不斷的改進寫作的水準,希望與大家共同交流和進步。 本文轉自 hot的fans  51CTO部落格,原文連結: http://blog.51cto.com/2435232/504315