在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)
Command:
创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。
Command
#ifndef CommandH
#define CommandH
#include "CAbstractReciver.h"
class command
{
public:
virtual ~command(){};
virtual void exec()=0;
void SetReciver(CAbstractReciver *tCAbstractReciver){pCAbstractReciver = tCAbstractReciver;};
protected:
command(){};
CAbstractReciver *pCAbstractReciver;
};
#endifConcreteCommand
#ifndef ConcreateCommandH
#define ConcreateCommandH
#include "command.h"
class ConcreateCommand:public command
{
public:
~ConcreateCommand(){};
ConcreateCommand(){};
void exec(){pCAbstractReciver->Action();};
};
#endifReceiver:
#ifndef CAbstractReciverH
#define CAbstractReciverH
#include <iostream>
using namespace std;
class CAbstractReciver
{
public:
virtual ~CAbstractReciver(){};
virtual void Action() = 0;
protected:
CAbstractReciver(){};
};
#endif
#ifndef CReciverAH
#define CReciverAH
#include "CAbstractReciver.h"
class CReciverA:public CAbstractReciver
{
public:
CReciverA(){};
~CReciverA(){};
void Action(){cout<<"我打开了电视机"<<endl; };
};
#endif
#ifndef CReciverBH
#define CReciverBH
#include "CAbstractReciver.h"
class CReciverB:public CAbstractReciver
{
public:
CReciverB(){};
~CReciverB(){};
void Action(){cout<<"我打开了空调"<<endl; };
};
#endifInvoker:
#ifndef CInvokerH
#define CInvokerH
#include "command.h"
class CInvoker
{
public:
CInvoker(){};
~CInvoker(){};
void exec(command *pcommand){pcommand->exec();};
};
#endifClient:
#include "CAbstractReciver.h"
#include "ConcreateCommand.h"
#include "CReciverA.h"
#include "CReciverB.h"
#include "CInvoker.h"
int main()
{
CInvoker tCInvoker;
ConcreateCommand *pConcreateCommand = new ConcreateCommand();
CReciverA *pCReciverA = new CReciverA();
pConcreateCommand->SetReciver(pCReciverA);
tCInvoker.exec(pConcreateCommand);
CReciverB *pCReciverB = new CReciverB();
pConcreateCommand->SetReciver(pCReciverB);
tCInvoker.exec(pConcreateCommand);
return 0;
}makefile
aLL:Command
CC = g++
INCLUDE = .
CFLAGS = -g -Wall
Command:main.o CReciverA.o CReciverB.o ConcreateCommand.o CInvoker.o
$(CC) -o Command main.o CReciverA.o CReciverB.o ConcreateCommand.o CInvoker.o
CReciverA.o:CReciverA.cpp CReciverA.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c CReciverA.cpp
CReciverB.o:CReciverB.cpp CReciverB.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c CReciverB.cpp
ConcreateCommand.o:ConcreateCommand.cpp ConcreateCommand.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c ConcreateCommand.cpp
CInvoker.o:CInvoker.cpp CInvoker.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c CInvoker.cpp
main.o:main.cpp
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.cpp
clean:
rm *.o
rm Commandresult
administrator@ubuntu:~/桌面/Java/DesignMode/Command$ make -f makefile
g++ -I. -g -Wall -c main.cpp
g++ -I. -g -Wall -c CReciverA.cpp
g++ -I. -g -Wall -c CReciverB.cpp
g++ -I. -g -Wall -c ConcreateCommand.cpp
g++ -I. -g -Wall -c CInvoker.cpp
g++ -o Command main.o CReciverA.o CReciverB.o ConcreateCommand.o CInvoker.o
administrator@ubuntu:~/桌面/Java/DesignMode/Command$ ./Command
我打开了电视机
我打开了空调
administrator@ubuntu:~/桌面/Java/DesignMode/Command$
本文出自 “风清扬song” 博客,请务必保留此出处http://2309998.blog.51cto.com/2299998/1394602
原文:http://2309998.blog.51cto.com/2299998/1394602