Command 命令模式(行為模式)

介紹

??命令模式:將請求封裝成對象,以便使用不同的請求、日志阵面、隊(duì)列等來參數(shù)化其他對象。命令模式也支持撤銷操作洪鸭。

參與者

  • Command 聲明執(zhí)行操作的接口样刷。
  • ConcreteCommand 將一個接受者對象 綁定一個動作,調(diào)用接收著相應(yīng)的操作卿嘲,以實(shí)現(xiàn)excute颂斜。
  • Client 創(chuàng)建一個具體命令并設(shè)定它的接收者。
  • Invoker 存儲具體的命令拾枣,執(zhí)行用戶的請求沃疮。
  • Receiver 知道如何執(zhí)行請求,就是實(shí)際的操作梅肤。

代碼

class ReceiverA {//Receiver
public:
    void  doSomthing() {
        std::cout<<"DO A"<<std::endl;
    }
};

class ReceiverB {//Receiver
public:
    void  doSomthing() {
        std::cout<<"DO B"<<std::endl;
    }
};


class ICommand{//命令對象基類 Command
public:
    virtual ~ICommand(){}
    virtual void Execute() = 0;
};

class CommandA : public  ICommand{//ConcreteCommand 
public:
    explicit CommandA(ReceiverA *a):rec(a){}
    void Execute() override {
        rec->doSomthing();
    }
private:
    ReceiverA *rec;
};
class CommandB : public  ICommand{//ConcreteCommand 
public:
    explicit CommandB(ReceiverB *a):rec(a){}
    void Execute() override {
        rec->doSomthing();
    }
private:
    ReceiverB *rec;
};


class Invoker{//Invoker
public:
    void Add(int index,ICommand *cmd){
        command_m.insert(std::make_pair(index,cmd));
    }
    void Remove(int index){
        command_m.erase(index);
    }
    void DoCmd(int i){
        auto it = command_m.find(i);
        if(command_m.end() != it)
        {
            it->second->Execute();
        }
    }
private:
    std::map<int,ICommand *> command_m;
};

int main()//Client
{
    Invoker invoker;
    ICommand *cmd1 = new CommandA(new ReceiverA);
    ICommand *cmd2 = new CommandB(new ReceiverB);
    invoker.Add(1,cmd1);
    invoker.Add(2,cmd2);
    invoker.DoCmd(2);
    invoker.DoCmd(1);
    invoker.DoCmd(4);
    invoker.DoCmd(2);
}

輸出

DO B
DO A
DO B

特點(diǎn)

  • 將調(diào)用命令的對象與和如何實(shí)現(xiàn)命令的對象解耦
  • 增加新的Command很容易

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末司蔬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姨蝴,更是在濱河造成了極大的恐慌俊啼,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件左医,死亡現(xiàn)場離奇詭異授帕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浮梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門跛十,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秕硝,你說我怎么就攤上這事芥映。” “怎么了远豺?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵奈偏,是天一觀的道長。 經(jīng)常有香客問我躯护,道長惊来,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任棺滞,我火速辦了婚禮唁盏,結(jié)果婚禮上内狸,老公的妹妹穿的比我還像新娘。我一直安慰自己厘擂,他們只是感情好昆淡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刽严,像睡著了一般昂灵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舞萄,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天眨补,我揣著相機(jī)與錄音,去河邊找鬼倒脓。 笑死撑螺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崎弃。 我是一名探鬼主播甘晤,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饲做!你這毒婦竟也來了线婚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤盆均,失蹤者是張志新(化名)和其女友劉穎塞弊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泪姨,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡游沿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肮砾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诀黍。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唇敞,靈堂內(nèi)的尸體忽然破棺而出蔗草,到底是詐尸還是另有隱情咒彤,我是刑警寧澤疆柔,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站镶柱,受9級特大地震影響旷档,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歇拆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一鞋屈、第九天 我趴在偏房一處隱蔽的房頂上張望范咨。 院中可真熱鬧,春花似錦厂庇、人聲如沸渠啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽替蛉。三九已至,卻和暖如春拄氯,著一層夾襖步出監(jiān)牢的瞬間躲查,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工译柏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镣煮,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓鄙麦,卻偏偏與公主長得像典唇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子黔衡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 1 意圖 將一個請求封裝為一個對象蚓聘,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊(duì)或記錄請求日志盟劫,以及支持可撤...
    10xjzheng閱讀 597評論 0 1
  • 【學(xué)習(xí)難度:★★★☆☆夜牡,使用頻率:★★★★☆】直接出處:命令模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 836評論 0 3
  • 意圖 簡單的說,命令模式可將“動作的請求者”從“動作的執(zhí)行者”對象中解耦侣签。 將一個請求封裝為一個對象塘装,從而使你可用...
    tomas家的小撥浪鼓閱讀 13,299評論 4 5
  • 1.初識命令模式 將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化影所;對請求排隊(duì)或記錄請求日志蹦肴,以及...
    王偵閱讀 712評論 0 2
  • 生活場景分析 今天來學(xué)習(xí)命令模式,先從一個生活中的例子入手吧猴娩,這樣理解起來也比較容易阴幌。大家應(yīng)該有用過那種萬能遙控器...
    西木柚子閱讀 730評論 2 6