1. 程式人生 > >C++設計模式10--命令模式(二)(Command)--降低請求傳送者與接收者耦合

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


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

電視機是請求的接收者Receiver

遙控器是請求的傳送者ConcreteCommand

遙控器上有一些按鈕,不同的按鈕對應電視機的不同操作。

抽象命令角色由一個命令介面來扮演,有三個具體的命令類實現了抽象命令介面,這三個具體命令類分別代表三種操作:開啟電視機、關閉電視機和切換頻道。

顯然,電視機遙控器就是一個典型的命令模式應用例項。

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
using namespace std;
/*
電視機是請求的接收者,
    也只有它的內部有一堆指令集合可以執行各種命令,它才是命令的真正執行者
    因此它有Open開啟電視, Close關閉電視,Change更換頻道的介面
遙控器是請求的傳送者,
    它內含命令的物件,
    負責將這個命令傳送出去,因此需要有設定命令的介面,相當於人按下遙控器的按鈕
    內含RunCommand執行命令的介面,它呼叫了命令介面的Execute執行函式

遙控器上的那些按鈕,
    不同的按鈕對應電視機的不同操作。
    抽象命令角色由一個命令介面來扮演,
    有三個具體的命令類實現了抽象命令介面,
    這三個具體命令類分別代表三種操作:
    開啟電視機、關閉電視機和切換頻道。

顯然,電視機遙控器就是一個典型的命令模式應用例項。
*/




// 接收者物件, 電視才是真正命令的執行者
class Television
{
public :
    void Open( )       // 開啟電視
    {
        std::cout <<"開啟電視" <<std::endl;
    }

    void Close( )      // 關閉電視
    {
        std::cout <<"關閉電視" <<std::endl;
    }

    void Change( )     // 切換頻道
    {
        std::cout <<"更換頻道" <<std::endl;
    }
};


class Command
{
public :
    virtual void Execute( ) = 0;         // 執行的介面
};

// 開啟電視的命令
class OpenCommand : public Command
{
public :
    OpenCommand(Television *tv)
    {
        m_tv = tv;
    }

    void Execute( )         // 執行的介面
    {
        //std::cout <<"開啟電視" <<std::endl;
        m_tv->Open( );
    }
protected :
    Television *m_tv;
};

// 關閉電視的命令
class CloseCommand : public Command
{
public :
    CloseCommand(Television *tv)
    {
        m_tv = tv;
    }
    void Execute( )         // 執行的介面
    {
        //std::cout <<"關閉電視" <<std::endl;
        m_tv->Close( );
    }
protected :
    Television *m_tv;
};

// 更換頻道的命令
class ChangeCommand : public Command
{
public :
    ChangeCommand(Television *tv)
    {
        m_tv = tv;
    }
    void Execute( )         // 執行的介面
    {
        //std::cout <<"更換頻道" <<std::endl;
        m_tv->Change( );
    }
protected :
    Television *m_tv;
};

// Invoker請求傳送者
// 要求命令物件執行請求,
// 通常會持有命令物件,可以持有很多的命令物件
class Control
{
public :
    void SetCommand(Command *command)
    {
       this->m_command = command;
    }

    void RunCommand( )
    {
        m_command->Execute();
    }

protected:
    Command *m_command;

};

// 主程式其實就相當於我們人
int main( )
{
    // 我們手裡有一個遙控器
    Control *control = new Control;

    // 家裡有一個大彩電
    Television *tv = new Television;

    /// 首先我們開啟電視機
    // 建立一個開啟的命令, 這個命令只操縱tv這個物件
    Command *openCommand = new OpenCommand(tv);
    control->SetCommand(openCommand);
    control->RunCommand( );
    delete openCommand;


    // 換了好久頻道也沒找到好看的, 鬱悶的關掉電視機
    // 建立一個更換頻道的命令,這個命令只操縱tv這個物件
    Command *changeCommand = new ChangeCommand(tv);
    control->SetCommand(changeCommand);
    control->RunCommand( );
    delete changeCommand;

    // 換了好久頻道也沒找到好看的, 鬱悶的關掉電視機
    // 建立一個關閉的命令, 這個命令只操縱tv這個物件
    Command *closeCommand = new CloseCommand(tv);
    control->SetCommand(closeCommand);
    control->RunCommand( );
    delete closeCommand;

    delete tv;
    delete control;
    return 0;
}

相關推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

設計模式簡單小例子結構型模式

簡單小例子 原始碼已經上傳到了GitHub. https://github.com/tanglonghui/DesignPatterns 設計模式簡單小例子(一) 建立型模式: https://blog.csdn.net/qq_40687864/article/details/810

設計模式——java版》

第三章  建立型模式簡介 一、單例模式           1. 意思是:確保一個類只有一個例項,而且自行例項化並向整個系統提供這個例項          2. 適

設計模式六大原則例子-- 單一職責原則SRP例子

之前我們對設計模式的六大原則做了簡單歸納,這篇部落格是對單一職責原則進行的舉例說明。 單一職責原則的意義 物件不應該承擔太多職責,正如人不應該一心分為二用。唯有專注,才能保證物件的高內聚;唯有單一,才能保證物件的細粒度。物件的高內聚與細粒度有利於物件的

哈爾濱工業大學計算機學院-模式識別-課程總結-概率密度函式的引數估計

1. 概率密度函式的引數估計 前文講到了利用貝葉斯決策理論構建貝葉斯分類器,初學者難免會有疑問,既然已經可以通過構建貝葉斯分類器的方法處理分類問題,那為什麼還要學習本章節內容? 事實上,貝葉斯分類器的缺可以通過計算先驗概率與類條件概率來設計最優分類器。但是對於大多數實際問題,我們往往無法知道這兩個

哈爾濱工業大學計算機學院-模式識別-課程總結-概率密度函數的參數估計

展開 處理 play bold 避免 dot max 應用 既然 1. 概率密度函數的參數估計 前文講到了利用貝葉斯決策理論構建貝葉斯分類器,初學者難免會有疑問,既然已經可以通過構建貝葉斯分類器的方法處理分類問題,那為什麽還要學習本章節內容? 事實上,貝葉斯分類器的缺可以

從零開始構建一個Reactor模式的網路庫執行緒類Thread

執行緒類Thread是對POSIX執行緒的封裝類,因為要構建的是一個Linux環境下的多執行緒網路庫,對執行緒的封裝是很必要的。 首先是CurrentThread名稱空間,主要是獲取以及快取執行緒id: 1 #ifndef CURRENTTHREAD_H 2 #define CURRENTTHR

RabbitMQ入門及常用的5種模式的簡單使用

RabbitMQ是一個非常常用也非常強大的訊息中介軟體,主要用於應用與應用之間的通訊,有五種常見的使用方式,分別是:簡單模式,工作模式,釋出訂閱模式,路由模式以及萬用字元模式,這裡主要是路由模式的三種具

c語言數據類型

nbsp tex 字符 pre 字符串 輸入 mce 一個 命令 char 類型 1.char 變量 常量   char c; 定義一個char變量   c = ‘a’ ‘a‘字符常量   char 的本質就是一個整數,只有一個字節大小的整數 2.printf 輸出ch

C語言老司機學Python

append 設計 sta one list 老板 com oob als 標準數據類型: 共6種:Number(數字),String(字符串),List(列表),Tuple(元組),Sets(集合),Dictionary(字典) 本次學習主要是和數據類型混個臉熟,

linux基本命令總結

mef 進行 天前 ota naconda username n+1 ever flat 3、基本命令-2基本命令-2壓縮和歸檔打包:即歸檔,類似於旅遊之前收拾行李壓縮:為了減少占用的磁盤空間,可以做備份,在網絡上傳輸時節省網絡帶寬。打包壓縮軟件windows:winrar

C# 設置Excel條件格式

result pbo 調試運行 註意 sin 兩個 collect raw gree 上一篇文章中介紹了關於設置Excel條件格式,包括基於單元格值、自定義公式等應用條件格式、應用數據條條件類型格式、刪除條件格式等內容。在本篇文章中將繼續介紹C# 設置條件格式的方法。 要點

C++多線程同步技巧--- 事件

create include 解鎖 signed 選擇 參數 bre tdi 人工 簡介 Windows在線程同步方面提供了多種信號處理機制,其中一種便是使用 CreateEvent() 函數創建事件,然後使用信號控制同步。其中將事件變為有信號可使用 SetEvent()

git命令使用

上次寫的git命令,基本上能夠支援一個專案的基本運行了,但是git不是就那幾個命令還有一些其他的命令,來看一下 建立一個資料夾,想在這個資料夾下建立專案,就執行這個命令就行 $ git init   裡面有一些配置啥的選項,我是基本上不去配置這些,一路的回車操作,建立完成,資料夾下會出現p