国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《設計模式的藝術》筆記 - 命令模式

這篇具有很好參考價值的文章主要介紹了《設計模式的藝術》筆記 - 命令模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

介紹

? ? ? ? 命令模式將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。命令模式是一種對象行為模式,其別名為動作模式或事務模式。

實現(xiàn)

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <unordered_map>
#include <atomic>

class Command { // 命令抽象類
public:
    virtual void execute() = 0;
};

class Reciever {    // 命令接收者,可以繼承實現(xiàn)具體的接收類
public:
    virtual void action();
};

class ConcreteCommand : public Command {    // 具體命令類
public:
    ConcreteCommand();
    ~ConcreteCommand();
    void execute() override;

private:
    Reciever *m_reciever;
};

class Invoker { // 調用者類,命令發(fā)送者
public:
    Invoker(Command *command);
    void call();

private:
    Command *m_command;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"
#include <thread>
#include <unistd.h>

ConcreteCommand::ConcreteCommand() {
    m_reciever = new Reciever();
}

ConcreteCommand::~ConcreteCommand() {
    if (m_reciever)
        delete m_reciever;
}

void ConcreteCommand::execute() {
    m_reciever->action();
}

void Reciever::action() {
    std::cout << "接收者處理命令" << std::endl;
}

Invoker::Invoker(Command *command) {
    m_command = command;
}

void Invoker::call() {
    m_command->execute();
}

main.cpp

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Command *command = new ConcreteCommand();
    Invoker *invoker = new Invoker(command);
    invoker->call();

    return 0;
}

命令隊列實現(xiàn)

? ? ? ? 只需要增加一個CommandQueue類即可,Invoker中保存對CommandQueue的引用。

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <unordered_map>
#include <atomic>
#include <vector>

class Command { // 命令抽象類
public:
    virtual void execute() = 0;
};

class Reciever {    // 命令接收者,可以繼承實現(xiàn)具體的接收類
public:
    virtual void action();
};

class ConcreteCommand : public Command {    // 具體命令類
public:
    ConcreteCommand();
    ~ConcreteCommand();
    void execute() override;

private:
    Reciever *m_reciever;
};

class CommandQueue {
public:
    void execute();
    void addCommand(Command *command);
    void removeCommand(Command *command);

private:
    std::vector<Command *> m_commands;
};

class Invoker { // 調用者類,命令發(fā)送者
public:
    Invoker(CommandQueue *commands);
    void call();

private:
    CommandQueue *m_commands;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"
#include <thread>
#include <unistd.h>

ConcreteCommand::ConcreteCommand() {
    m_reciever = new Reciever();
}

ConcreteCommand::~ConcreteCommand() {
    if (m_reciever)
        delete m_reciever;
}

void ConcreteCommand::execute() {
    m_reciever->action();
}

void Reciever::action() {
    std::cout << "接收者處理命令" << std::endl;
}

Invoker::Invoker(CommandQueue *commands) {
    m_commands = commands;
}

void Invoker::call() {
    m_commands->execute();
}

void CommandQueue::execute() {
    for (auto it = m_commands.begin(); it != m_commands.end(); ++it) {
        (*it)->execute();
    }
}

void CommandQueue::addCommand(Command *command) {
    m_commands.push_back(command);
}

void CommandQueue::removeCommand(Command *command) {
    for (auto it = m_commands.begin(); it != m_commands.end(); ) {
        if (*it == command) {
            it = m_commands.erase(it);
        } else {
            ++it;
        }
    }
}

main.cpp

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Command *command = new ConcreteCommand();
    CommandQueue *queue = new CommandQueue();
    queue->addCommand(command);
    Invoker *invoker = new Invoker(queue);
    invoker->call();

    delete invoker;
    delete queue;
    delete command;

    return 0;
}

撤銷操作

? ? ? ? 在命令類中增加一個逆向操作,也可以通過保存對象的歷史狀態(tài)來實現(xiàn)狀態(tài)回滾。

請求日志

? ? ? ? 執(zhí)行命令時增加日志的記錄操作。

宏命令

? ? ? ? 組合模式和命令模式的結合,可以實現(xiàn)批量命令的執(zhí)行,與命令隊列類似,不同的是宏命令類繼承自命令抽象類(Command),可以遞歸調用。

總結

優(yōu)點

? ? ? ? 1.?降低系統(tǒng)的耦合度。由于請求者與接收者之間不存在直接引用,因此請求者與接收者之間實現(xiàn)完全解耦,相同的請求者可以對應不同的接收者。同樣,相同的接收者也可以供不同的請求者使用,兩者之間具有良好的獨立性。

? ? ? ? 2.?新的命令可以很容易地加入系統(tǒng)中。由于增加新的具體命令類不會影響到其他類,因此增加新的具體命令類很容易,無須修改原有系統(tǒng)源代碼甚至客戶類代碼,滿足開閉原則的要求。

? ? ? ? 3.?可以比較容易地設計一個命令隊列或宏命令(組合命令)。

? ? ? ? 4.?為請求的撤銷(Undo)和恢復(Redo)操作提供了一種設計和實現(xiàn)方案。

缺點

? ? ? ? 1.?使用命令模式可能會導致某些系統(tǒng)有過多的具體命令類。因為針對每一個對請求接收者的調用操作都需要設計一個具體命令類,因此在某些系統(tǒng)中可能需要提供大量的具體命令類,這將影響命令模式的使用。

適用場景

? ? ? ? 1.?系統(tǒng)需要將請求調用者和請求接收者解耦,使得調用者和接收者不直接交互。請求調用者無須知道接收者的存在,也無須知道接收者是誰,接收者也無須關心何時被調用。

? ? ? ? 2.?系統(tǒng)需要在不同的時間指定請求、將請求排隊和執(zhí)行請求。一個命令對象和請求的初始調用者可以有不同的生命期。換言之,最初的請求發(fā)出者可能已經不在了,而命令對象本身仍然是活動的,可以通過該命令對象去調用請求接收者,而無須關心請求調用者的存在性,可以通過請求日志文件等機制來具體實現(xiàn)。

? ? ? ? 3.?系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(Redo)操作。

? ? ? ? 4.?系統(tǒng)需要將一組操作組合在一起形成宏命令。

練習

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <unordered_map>
#include <atomic>
#include <vector>

class Command { // 命令抽象類
public:
    virtual void execute() = 0;
};

class BoardScreen {    // 命令接收者
public:
    void open();
    void create();
    void edit();
};

class OpenCommand : public Command {    // 具體命令類
public:
    OpenCommand(BoardScreen *reciever);
    void execute() override;

private:
    BoardScreen *m_reciever;
};

class CreateCommand : public Command {    // 具體命令類
public:
    CreateCommand(BoardScreen *reciever);
    void execute() override;

private:
    BoardScreen *m_reciever;
};

class EditCommand : public Command {    // 具體命令類
public:
    EditCommand(BoardScreen *reciever);
    void execute() override;

private:
    BoardScreen *m_reciever;
};

class Invoker { // 調用者類,命令發(fā)送者
public:
    Invoker(Command *command);
    void call();

private:
    Command *m_command;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"
#include <thread>
#include <unistd.h>

void BoardScreen::open() {
    std::cout << "打開" << std::endl;
}

void BoardScreen::create() {
    std::cout << "新建" << std::endl;
}

void BoardScreen::edit() {
    std::cout << "編輯" << std::endl;
}

OpenCommand::OpenCommand(BoardScreen *reciever) {
    m_reciever = reciever;
}

void OpenCommand::execute() {
    m_reciever->open();
}

CreateCommand::CreateCommand(BoardScreen *reciever) {
    m_reciever = reciever;
}

void CreateCommand::execute() {
    m_reciever->create();
}

EditCommand::EditCommand(BoardScreen *reciever) {
    m_reciever = reciever;
}

void EditCommand::execute() {
    m_reciever->edit();
}

Invoker::Invoker(Command *command) {
    m_command = command;
}

void Invoker::call() {
    m_command->execute();
}

main.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-808172.html

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    BoardScreen *boardScreen = new BoardScreen();
    Command *command = new OpenCommand(boardScreen);
    Invoker *invoker = new Invoker(command);
    invoker->call();
    delete command;
    delete invoker;

    command = new CreateCommand(boardScreen);
    invoker = new Invoker(command);
    invoker->call();
    delete command;
    delete invoker;

    command = new EditCommand(boardScreen);
    invoker = new Invoker(command);
    invoker->call();
    delete command;
    delete invoker;

    return 0;
}

到了這里,關于《設計模式的藝術》筆記 - 命令模式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 《設計模式的藝術》筆記 - 代理模式

    ? ? ? ? 代理模式是給某一個對象提供一個代理,并由代理對象控制對原對象的引用。代理模式是一種對象結構型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?代理模式能夠協(xié)調調用者和被調用者,在一定程度上降低了系統(tǒng)的耦合度,滿足迪米特法則。 ? ? ? ? 2.?客戶端可以

    2024年01月19日
    瀏覽(15)
  • 《設計模式的藝術》筆記 - 橋接模式

    ? ? ? ? 橋接模式將抽象部分與其實現(xiàn)部分分離,使它們都可以獨立地變化。它是一種對象結構型模式,又稱為柄體模式或接口模式 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?分離抽象接口及其實現(xiàn)部分。橋接模式使用“對象間的關聯(lián)關系”解耦了抽象和實現(xiàn)之間固有的綁定關系,

    2024年01月18日
    瀏覽(23)
  • 《設計模式的藝術》筆記 - 策略模式

    ? ? ? ? 策略模式定義一系列算法類,將每一個算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨立于使用它的客戶而變化,也稱為政策模式。策略模式是一種對象行為模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?策略模式提供了對開閉原則的完美支持。用戶可以在不

    2024年01月25日
    瀏覽(23)
  • 《設計模式的藝術》筆記 - 原型模式

    ? ? ? ? 使用原型實例指定創(chuàng)建對象的種類,并且通過克隆這些原型創(chuàng)建新的對象。原型模式是一種對象創(chuàng)建型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 優(yōu)點: ? ? ? ? 1.?當創(chuàng)建新的對象實例較為復雜時,使用原型模式可以簡化對象的創(chuàng)建過程,通過復制一個已有實例可以提

    2024年01月19日
    瀏覽(23)
  • 《設計模式的藝術》筆記 - 迭代器模式

    ? ? ? ? 迭代器模式提供一種方法來訪問聚合對象,而不用暴露這個對象的內部表示,其別名為游標(Cursor)。迭代器模式是一種對象行為型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1. 支持以不同的方式遍歷一個聚合對象,在同一個聚合對象上可以定義多種遍歷方式。在迭代

    2024年01月24日
    瀏覽(21)
  • 《設計模式的藝術》筆記 - 簡單工廠模式

    《設計模式的藝術》筆記 - 簡單工廠模式

    ? ? ? ? 定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創(chuàng)建的實例通常都具有相同的父類。因為在簡單工廠模式中用于創(chuàng)建實例的方法是靜態(tài)方法,因此簡單工廠模式又被稱為靜態(tài)工廠方法模式,屬于類創(chuàng)建型模式 ? ? ? ? 將Factory合并到父類Product中,此時

    2024年01月16日
    瀏覽(21)
  • 《設計模式的藝術》筆記 - 單例模式

    ????????單例模式優(yōu)點是可以確保系統(tǒng)中只存在單個對象實例,缺點是不便擴展,一定程度上違背單一原則,既提供業(yè)務方法,又提供創(chuàng)建對象方法 ? ? ? ? 在類加載的時候就創(chuàng)建好對象,獲取對象時直接返回即可 ? ? ? ? 在類加載的時候沒有創(chuàng)建對象,第一次獲取對象

    2024年02月02日
    瀏覽(18)
  • 《設計模式的藝術》筆記 - 抽象工廠模式

    ? ? ? ? 提供了一個創(chuàng)建一系列相關或相互依賴的對象的接口,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,它是一種對象創(chuàng)建型模式。 ? ? ? ? 在抽象工廠模式中,每個具體工廠都提供了多個工廠方法用于產生多種不同類型的產品,這些產品構成了一個產品族。

    2024年01月16日
    瀏覽(27)
  • 《設計模式的藝術》筆記 - 建造者模式

    ? ? ? ? 建造者模式將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。建造這模式是一種對象創(chuàng)建型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 優(yōu)點: ? ? ? ? 1.?在建造者模式中,客戶端不必知道產品內部組成的細節(jié),將產品本身與產品的創(chuàng)建

    2024年01月16日
    瀏覽(24)
  • 《設計模式的藝術》筆記 - 享元模式

    ? ? ? ? 享元模式運用共享技術有效地支持大量細粒度對象的復用。系統(tǒng)只使用少量的對象,而這些對象都很相似,狀態(tài)變化很小,可以實現(xiàn)對象的多次復用。由于享元模式要求能夠共享的對象必須是細粒度對象,因此它又稱為輕量級模式,是一種對象結構型模式。 myclass.

    2024年01月19日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包