在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(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; }; #endif
ConcreteCommand
#ifndef ConcreateCommandH #define ConcreateCommandH #include "command.h" class ConcreateCommand:public command { public: ~ConcreateCommand(){}; ConcreateCommand(){}; void exec(){pCAbstractReciver->Action();}; }; #endif
Receiver:
#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; }; }; #endif
Invoker:
#ifndef CInvokerH #define CInvokerH #include "command.h" class CInvoker { public: CInvoker(){}; ~CInvoker(){}; void exec(command *pcommand){pcommand->exec();}; }; #endif
Client:
#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 Command
result
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