[设计模式]行为模式-命令模式(C++描述)

 [设计模式]行为模式-命令模式(C++描述)

second60 20180601

1. 命令模式定义

命令模式通过将请求封装到一个commond对象中,并将请求的接受者存放到receiver中, 从而实现调用操作的对象操作的具体实现者之间的解耦。

命令模式又称为动作模式或事务模式。

通常情况下,消息封装好后直接调用处理接口,这是直接调用。而命令模式把消息封装和消息调用两者分离,两者之间不用关心对方,采用的是回调的思想。

2. 命令模式结构图

 

命令父类Command: 声明命令类的抽象接口。

具体命令ConcreteCommand: 定义一个接受者和行为之间的弱耦合。实现execute()方法,负责调用接收的相应操作。

接收者Reveiver: 负责具体实施和执行一个请求。

请求者Invoker: 负责调用命令对象执行请求。

 

3. 代码

// 接收者

class  Reciever

{

public:

Reciever();

~Reciever();

void Action(){}

};

// 命令抽象类

class Command

{

public:

virtual ~Command();

virtual void Excute() = 0; // 命令的执行方法

protected:

Command();

};

// 具体的命令类

// 里面包含一个接收者

class  ConcreteCommand: public Command

{

public:

ConcreteCommand(Reciever* rev):_rev(rev){}

~ConcreteCommand(){delete this->_rev;}

void Excute(){

_rev->Action();

}

private:

Reciver* _rev;

};

// 具体的执行类

class  Invoker

{

public:

Invoker(Command* cmd){_cmd = cmd;}

~Invoker(){delete _cmd;}

void Invoke(){_cmd_Excute();}

private:

Command* _cmd;

}

 

int main()

{

Reciever* rev = new Reciever();

Command* cmd = new ConcreteCommand(rev);

Invoker* inv = new Invoker(cmd);

inv->Invoke();

return 0;

}

4 使用场景

1 Multi-level undo(多级undo操作) 

2 Transactional behavior(原子事务行为)

3 Progress bars(状态条)

4 Wizards(导航)

5 GUI buttons and menu items(GUI按钮与菜单条等等)

6 Thread pools(线程池)

7 Macro recording(宏纪录)


5 优缺点

优点:

1) 降低系统的耦合度:Command模式将调用操作的对象与知道如何实现该操作的对象解耦。

2) Command容易扩展,新加一个命令,继续实现即可

3) 组合命令:你可将多个命令装配成一个组合命令,即可以比较容易地设计一个命令队列和宏命令。一般说来,组合命令是Composite模式的一个实例。

4) 增加新的Command很容易,因为这无需改变已有的类。

5)可以方便地实现对请求的Undo和Redo。

 

缺点:

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。(其实也算不上什么缺点,大部份设计模式都有这样的问题,但系统的扩展性相比少内个类更重要)

 

6 总结

1)命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。

2)每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作

3)命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

4)命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。

5)命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。 

猜你喜欢

转载自blog.csdn.net/second60/article/details/80537736