您的位置:首页 > 其它

设计模式一日一练:命令模式(Command)

2014-05-06 23:35 357 查看
Command模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

// command
class Command {
    public:
        virtual void Execute();
};

// command
class Receiver;
class ConcreteCommand: public Command {
    public:
        public ConcreteCommand(Receiver* receiver);
        virtual void Execute();
        
    private:
        Receiver* receiver;
};

ConcreteCommand::ConcreteCommand(Receiver* receiver) {
    this->receiver = receiver;
}

void ConcreteCommand::Execute() {
    this->receiver->Action();
}

// receiver
class Receiver {
    public:
        void Action();
}

// 
class Invoker {
    public:
        void SetCommand(Command* cmd);
        void ExecuteCommand();
        
    private:
        Command* command;
}

void Invoker::SetCommand(Command* cmd) {
    this->command = cmd;
}

void Invoker::ExecuteCommand() {
    this-command->Execute();
}

// test
void Test() {
    Receiver* receiver = new Receiver();
    Command* command = new ConcreteCommand(receiver);
    Invoker* invoker = new Invoker();
    invoker->SetCommand(command);
    
    invoker->ExecuteCommand();
    
    // todo ...  destroy
}


PS. 腾讯引擎技术中心的一位技术牛人写过一篇用命令模式封装多线程调用的blog,命令模式的典型应用场景。

PS. 我的设计模式系列blog,《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: