1. 程式人生 > >請求傳送者與接收者解耦——命令模式(三)

請求傳送者與接收者解耦——命令模式(三)

4 命令佇列的實現

       有時候我們需要將多個請求排隊當一個請求傳送者傳送一個請求時,將不止一個請求接收者產生響應,這些請求接收者將逐個執行業務方法,完成對請求的處理。此時,我們可以通過命令佇列來實現。

       命令佇列的實現方法有多種形式,其中最常用、靈活性最好的一種方式是增加一個CommandQueue類,由該類來負責儲存多個命令物件,而不同的命令物件可以對應不同的請求接收者,CommandQueue類的典型程式碼如下所示:

import java.util.*;

class CommandQueue {
    //定義一個ArrayList來儲存命令佇列
	private ArrayList<Command> commands = new ArrayList<Command>();
	
	public void addCommand(Command command) {
		commands.add(command);
	}
	
	public void removeCommand(Command command) {
		commands.remove(command);
	}
	
    //迴圈呼叫每一個命令物件的execute()方法
	public void execute() {
		for (Object command : commands) {
			((Command)command).execute();
		}
	}
}

在增加了命令佇列類CommandQueue以後,請求傳送者類Invoker將針對CommandQueue程式設計,程式碼修改如下:

class Invoker {
	private CommandQueue commandQueue; //維持一個CommandQueue物件的引用
	
    //構造注入
	public Invoker(CommandQueue commandQueue) {
		this. commandQueue = commandQueue;
	}
	
    //設值注入
	public void setCommandQueue(CommandQueue commandQueue) {
		this.commandQueue = commandQueue;
	}
	
	//呼叫CommandQueue類的execute()方法
	public void call() {
		commandQueue.execute();
	}
}

命令佇列與我們常說的“批處理”有點類似。批處理,顧名思義,可以對一組物件(命令)進行批量處理,當一個傳送者傳送請求後,將有一系列接收者對請求作出響應,命令佇列可以用於設計批處理應用程式,如果請求接收者的接收次序沒有嚴格的先後次序,我們還可以使用多執行緒技術來併發呼叫命令物件的execute()方法,從而提高程式的執行效率。

相關推薦

請求送者接收者——命令模式

4 命令佇列的實現       有時候我們需要將多個請求排隊,當一個請求傳送者傳送一個請求時,將不止一個請求接收者產生響應,這些請求接收者將逐個執行業務方法,完成對請求的處理。此時,我們可以通過命令佇列

請求送者接收者——命令模式

  裝修新房的最後幾道工序之一是安裝插座和開關,通過開關可以控制一些電器的開啟和關閉,例如電燈或者排氣扇。在購買開關時,我們並不知道它將來到底用於控制什麼電器,也就是說,開關與電燈、排氣扇並無直接關係,

請求送者接收者——命令模式

Sunny軟體公司欲開發一個基於Windows平臺的公告板系統。該系統提供了一個主選單(Menu),在主選單中包含了一些選單項(MenuItem),可以通過Menu類的addMenuItem()方法增加選單項。選單項的主要方法是click(),每一個選單項包含一個抽象命令類,具體命令類包括OpenComman

請求送者接收者——命令模式

5 撤銷操作的實現        在命令模式中,我們可以通過呼叫一個命令物件的execute()方法來實現對請求的處理,如果需要撤銷(Undo)請求,可通過在命令類中增加一個逆向操作來實現。 擴充套件 除了通過一個逆向操作來實現撤銷(Undo)外,還可以通

請求送者接收者——命令模式

3 完整解決方案       為了降低功能鍵與功能處理類之間的耦合度,讓使用者可以自定義每一個功能鍵的功能,Sunny軟體公司開發人員使用命令模式來設計“自定義功能鍵”模組,其核心結構如圖4所示:圖4 自定義功能鍵核心結構圖       在圖4中,FBSettingWindo

C++設計模式10--命令模式--降低請求送者接收者耦合

命令模式概述 在軟體系統中,“行為請求者”與“行為實現者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做、事務”等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何

C++設計模式10--命令模式(Command)--降低請求送者接收者耦合

  工作了一天感覺好累,洗了個澡,開啟電視看看有沒有喜歡的節目,拿起遙控器,看著上面的按鈕,忽然感覺好奇妙,我們按一開機鍵,電視就開了,然後...哈哈,真好玩,我按我按。細想之下這不就是一個命令模式麼。 電視機是請求的接收者Receiver, 遙控器是請求的傳送者Concr

設計模式命令模式

我回來啦!今天是週六,一看命令模式還有一個總結未完成,趕緊爬起來做做好。 就如上一篇所說的,如果擁有了一個遙控器,卻無法光憑按下一個按你,就同時能弄暗燈光、開啟音響和電視、設定到DVD,並讓熱水器開始加溫,那麼我要這個遙控器還有什麼意義呢? 使用巨集命令 根據比較高階的想法來看,就是我們需要製造一種新的命令,

關於姿態融合的程式碼註釋篇

        加速度計和陀螺儀都能計算出姿態,但為何要對它們融合呢,是因為加速度計對振動之類的擾動很敏感,但長期資料計算出的姿態可信,而陀螺儀雖然對振動這些不敏感,但長期使用陀螺儀會出現漂移,因此我們要進行互補,短期相信陀螺,長期相信加計。不過,其實加計無法對航向角進行

5_Linux下命令大全20181229

Linux下解壓和打包命令大全(20181229) 1、tar 2、zip 3、rar 4、gz 5、tar.gz 和 .tgz 6、bz2 7、tar.bz2 8、bz 9、tar.bz 10、Z 11、

介面相關的設計模式1:定製服務模式和介面卡模式

在Java中我們通常把介面作為系統與外界互動的視窗,接下來我們來考慮以下問題: 如何設計介面? 當兩個系統之間介面不匹配時,如何處理? 但系統A無法便捷的引用系統B的介面的實現類例項時,如何處理? …… 為了解決以上問題,需要引入與介面相關的設計模式,接

TF-IDF余弦相似性的應用:自動摘要

下一步 dip target 似的 abs tps .net ebo ace 轉:http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html 有時候,很簡單的數學方法,就可以完成很復雜的任務。 這個

關於wamp的HTML, PHP, mysql 三者的操作聯系 - mysql簡單配置

長度 -1 logs 建議 用戶 不用 自帶 .com upd   上一章講完HTML與PHP之間的傳值方法,這一章將wamp中mysql的使用,為下一章PHP調用數據準備。 再次說明作者的wamp版本是3.0.6 64bit   打開wamp自帶的mysql試圖數據庫

設計模式-行為型模式命令模式11

不存在 delet rbo main sel creating delete == commands 命令模式(Command Pattern)是一種數據驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在對象中,並傳給調用對象。調用對象尋找可以處理該命令的合適的對象,

設計模式-命令模式行為、責任鏈模式行為

tst 是否 return 執行 mman cpp lap 2.0 兩種 0 命令模式和責任鏈模式 命令模式和責任鏈模式是兩種完全相反的模式。 命令模式是需要將請求排隊處理。因此將請求封裝成對象放入隊列。 而責任鏈模式則是,可能同一對象需要多個函數只有一個函數能處理。或是多

tcp的半連接完全連接隊列源碼分析

lin already .so sequence proc 狀態 ant 用途 title TCP 協議中的 SYN queue 和 accept queue 處理 若要理解本文意圖說明的問題,可能需要以下知識背景: listen 系統調用的 backlog 參數含義,

【Android 動畫】動畫詳之屬性動畫

大家好,在前兩篇中,我們介紹了Android的補間動畫和插值器,這一篇,我們來說下屬性動畫。 【Android 動畫】動畫詳解之補間動畫(一) 【Android 動畫】動畫詳解之插值器(二) 前言 通過前兩篇,我們已經熟悉了對View進行移動、縮放、旋轉和

C#泛型C#泛型C#泛型

  一、前面兩篇文章分別介紹了定義泛型型別、泛型委託、泛型介面以及宣告泛型方法:   詳解C#泛型(一)   詳解C#泛型(二)   首先回顧下如何構建泛型類: public class MyClass<T> { public void MyFunc() {

C#泛型

最大 泛型接口 oid 專用 技術分享 完全 html 回顧 連接   一、前面兩篇文章分別介紹了定義泛型類型、泛型委托、泛型接口以及聲明泛型方法:   詳解C#泛型(一)   詳解C#泛型(二)   首先回顧下如何構建泛型類: public class MyClass&

Linux常用命令大全

Linux常用命令大全(三) 檔案型別 普通檔案(文字檔案、資料檔案、可執行的二進位制檔案) 目錄檔案 同上 差別:由成對的“I節點號、檔名”構成的列表 裝置檔案 (字元裝置、塊裝置) 符號連結檔案 路徑名:絕對路徑和相對路徑 檔案連結:硬連結和符號連結(軟連線) 使用者和許可權