命令模式(command pattern)是一種資料驅動的設計模式,它屬於行為型模式。 請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件,該物件執行命令。
意圖:
將乙個請求封裝成乙個物件,從而使您可以用不同的請求對客戶進行引數化。
主要解決:
在軟體系統中,行為請求者與行為實現者通常是一種緊耦合的關係.
但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵禦變化的緊耦合的設計就不太合適。
何時使用:
在某些場合,比如要對行為進行"記錄、撤銷/重做、事務"等處理,這種無法抵禦變化的緊耦合是不合適的。
在這種情況下,如何將"行為請求者"與"行為實現者"解耦?將一組行為抽象為物件,可以實現二者之間的松耦合。
如何解決:
通過呼叫者呼叫接受者執行命令,順序:呼叫者→接受者→命令。
關鍵**:
定義三個角色:
1、received 真正的命令執行物件
2、command
3、invoker 使用命令物件的入口
應用例項:
struts 1 中的 action 核心控制器 actionservlet 只有乙個.
相當於 invoker,而模型層的類會隨著不同的應用有不同的模型類,相當於具體的 command。
優點:
1、降低了系統耦合度。
2、新的命令可以很容易新增到系統中去。
缺點:
使用命令模式可能會導致某些系統有過多的具體命令類。
使用場景:
認為是命令的地方都可以使用命令模式,比如:
1、gui 中每乙個按鈕都是一條命令。
2、模擬 cmd。
注意事項:
系統需要支援命令的撤銷(undo)操作和恢復(redo)操作,也可以考慮使用命令模式,見命令模式的擴充套件。
#pragma once
#include#include#includeclass docter
void treat_nose()
private:
protected:
};// 抽象命令類
class commandpattern
; ~commandpattern() {};
virtual void doctertreat() = 0; // 抽象介面
};// 命令類
class commanddoctertreateye:public commandpattern
; // 傳入引數,也叫注入引數
~commanddoctertreateye() {};
virtual void doctertreat() // 抽象介面實現
private:
docter * m_docter; // 更好的方法是傳入docter類的純虛基類做為一層介面,然後利用多型思想解耦和
void doctertreateye()
protected:
};// 命令類
class commanddoctertreatnose :public commandpattern
; // 傳入引數,也叫注入引數
~commanddoctertreatnose() {};
virtual void doctertreat() // 抽象介面實現
private:
docter * m_docter; // 更好的方法是傳入docter類的純虛基類做為一層介面,然後利用多型思想解耦和
void doctertreatnose() // 實際呼叫
protected:
};// **類,命令的發起者
class beautynurse
~beautynurse() {}
void submittecase() // 案例提交,下達命令
private:
commandpattern * m_commandpattern; // 能夠採集命令
protected:
};// **長類,命令的批量發起者
class advheadnurse
~advheadnurse() {}
void setcommend(commandpattern * command)
void submittecase() // 案例提交,下達命令
private:
std::listm_commandpatternlist;// 能夠採集一批命令
protected:
};
#include "commandpattern.h"
#include#include#include "commandpattern.h"
int maintest1(void)
int maintest2()
int main()
設計模式學習筆記 命令模式
定義 將乙個請求封裝成物件,從而讓你使用不同的請求把客戶端引數化,對請求排隊或者記錄請求的日誌,可以提供命令的撤銷和恢復功能。通用類圖如下 通用 如下 命令接受者 public abstract class receiver public class concretereceiver1 extend...
設計模式學習筆記 命令模式
我對命令模式的理解是用乙個命令物件 command 包裝乙個真正需要執行的物件 x x代表不同物件 而對於要執行x物件的invoker物件來說。它不關x物件是誰,繼承了誰,也不關心要執行這個x物件中的那些方法,因為物件x千萬個,方法更是千萬個,invoker關心不過來。所以invoker想了乙個辦法...
學習筆記 Java設計模式 命令模式
最近做開發發現自己 邏輯混亂,覺得有必要重溫下設計模式。於是就翻到了終點大神的部落格在這裡記錄下自己的學習後的理解。命令模式 命令模式的主要目的,用官話來說,是將呼叫者與執行者解耦。將 結構劃分為呼叫者 命令 執行者三個部分。其中,執行者作為命令的屬性被設定,因此,也可以理解為呼叫者 命令 執行者 ...