《設計模式》學習筆記 命令模式

2021-08-30 06:16:26 字數 2702 閱讀 2140

命令模式(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設計模式 命令模式

最近做開發發現自己 邏輯混亂,覺得有必要重溫下設計模式。於是就翻到了終點大神的部落格在這裡記錄下自己的學習後的理解。命令模式 命令模式的主要目的,用官話來說,是將呼叫者與執行者解耦。將 結構劃分為呼叫者 命令 執行者三個部分。其中,執行者作為命令的屬性被設定,因此,也可以理解為呼叫者 命令 執行者 ...