首页 > 其他 > 详细

命令模式

时间:2014-04-13 04:41:51      阅读:525      评论:0      收藏:0      [点我收藏+]

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象实现二者之间的松耦合。这就是命令模式(Command Pattern)


bubuko.com,布布扣




Command:

定义命令的接口,声明执行的方法。
ConcreteCommand:
命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
Receiver:
接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
Invoker:
要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
Client:

创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个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

命令模式,布布扣,bubuko.com

命令模式

原文:http://2309998.blog.51cto.com/2299998/1394602

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!