行为设计模式---命令模式(Command)
2014-08-20 15:18
369 查看
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;
对请求排队或记录请求日志,以及支持可撤销的操作
(1)Command,用来声明执行操作的接口
(2)ConcreteCommand,将一个接收者对象绑定于一个操作,调用接收者相应的操作,以实现Execute
(3)Invoker类,要求该命令执行这个请求
(4)Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。
Command模式通过将请求封装到一个对象Command中,并将请求的接收者存放到具体的ConcreteCommand类中,
从而实现调用操作的对象和操作的具体实现者之间的解耦。
Command模式结构图中,将请求的接收者(处理者)放到Command的具体子类ConcreteCommand中,
当请求到来时(agent发出buy消息激活Command对象),ConcreteCommand将处理请求交给Receiver对象进行处理。
优点:
(1)能较容易地设计一个命令队列;
(2)在需要的情况下,可以较容易地将命令记入日志;
(3)允许接收请求的一方决定是否要否决请求。
(4)可以容易地实现对请求的撤销和重做;
(5)由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
#include <iostream>
#include <vector>
using namespace std;
class Receiver
{
public:
void takeAction()
{
cout << "receiver takes action" << endl;
}
};
class Command
{
public:
virtual void execute() = 0;
virtual void undo() = 0;
virtual ~Command() { }
};
class BuyTicket : public Command
{
public:
BuyTicket(Receiver *receiver) : receiver_(receiver)
{
}
void execute()
{
receiver_->takeAction();
}
void undo()
{
cout << "the pool is full, please wait" << endl;
}
private:
Receiver *receiver_;
};
class Agent
{
public:
void buy(Command *cmd)
{
if (vec_.size() > 3)
{
cmd->undo();
vec_.pop_back();
}
else
{
vec_.push_back(cmd);
cmd->execute();
}
}
private:
vector<Command *> vec_;
};
int main()
{
Receiver receiver;
BuyTicket buyticket(&receiver);
Agent agent;
for (int i = 0; i < 5; ++i)
agent.buy(&buyticket);
return 0;
}
对请求排队或记录请求日志,以及支持可撤销的操作
(1)Command,用来声明执行操作的接口
(2)ConcreteCommand,将一个接收者对象绑定于一个操作,调用接收者相应的操作,以实现Execute
(3)Invoker类,要求该命令执行这个请求
(4)Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。
Command模式通过将请求封装到一个对象Command中,并将请求的接收者存放到具体的ConcreteCommand类中,
从而实现调用操作的对象和操作的具体实现者之间的解耦。
Command模式结构图中,将请求的接收者(处理者)放到Command的具体子类ConcreteCommand中,
当请求到来时(agent发出buy消息激活Command对象),ConcreteCommand将处理请求交给Receiver对象进行处理。
优点:
(1)能较容易地设计一个命令队列;
(2)在需要的情况下,可以较容易地将命令记入日志;
(3)允许接收请求的一方决定是否要否决请求。
(4)可以容易地实现对请求的撤销和重做;
(5)由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
#include <iostream>
#include <vector>
using namespace std;
class Receiver
{
public:
void takeAction()
{
cout << "receiver takes action" << endl;
}
};
class Command
{
public:
virtual void execute() = 0;
virtual void undo() = 0;
virtual ~Command() { }
};
class BuyTicket : public Command
{
public:
BuyTicket(Receiver *receiver) : receiver_(receiver)
{
}
void execute()
{
receiver_->takeAction();
}
void undo()
{
cout << "the pool is full, please wait" << endl;
}
private:
Receiver *receiver_;
};
class Agent
{
public:
void buy(Command *cmd)
{
if (vec_.size() > 3)
{
cmd->undo();
vec_.pop_back();
}
else
{
vec_.push_back(cmd);
cmd->execute();
}
}
private:
vector<Command *> vec_;
};
int main()
{
Receiver receiver;
BuyTicket buyticket(&receiver);
Agent agent;
for (int i = 0; i < 5; ++i)
agent.buy(&buyticket);
return 0;
}
相关文章推荐
- Java设计模式(20)——行为模式之命令模式(Command)
- 【设计模式】行为模式之Command命令
- 【设计模式基础】行为模式 - 4 - 命令(Command)
- 【设计模式学习笔记十五】【行为模式】【命令模式(Command)】
- 设计模式-行为设计模式:命令模式 Command
- 设计技巧16:命令模式 Command 将请求封装成对象,传递行为
- java设计模式之Command(菜单命令)
- .NET设计模式-命令模式(Command Pattern)
- Java实用设计模式:Command(命令模式)
- 设计模式学习日志(15)-Command命令(行为型模式) (引用)
- 设计模式 - Command Pattern(命令模式)
- 设计模式-Command(命令模式)
- 设计模式学习笔记(十七)——Command命令模式
- 设计模式之Command(命令)
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
- 设计模式 - Command Pattern(命令模式)
- 设计模式学习笔记(十七)——Command命令模式
- 设计模式----Command(命令)模式
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
- 设计模式 - Command Pattern(命令模式)