关于命令模式的一点意见

1。如果invoker中不必保存命令集,而仅执行一条命令的情况下,invoker类可以被省略

2。在命令类(Command中直接保存接收者(Receiver)的指针或者 引用的方式,并不可取,宜改为存储ID(前提是所有的receiver有统一的基类,并由全局管理)

下面是代码的对比,由于是演示代码,写的比较粗糙。

 

保存指针方式
1 class Command;
2   class Receiver;
3
4 #include < stdio.h >
5 #include < string >
6 using namespace std;
7 class Receiver
8 {
9 public :
10 void action( string str ){
11 printf( " %s excute command\n " ,str.c_str());
12 }
13 };
14
15 class Invoker
16 {
17 public :
18 Command * cmd;
19 };
20 class Command
21 {
22 public :
23 Command(Receiver * r){
24 rec = r;
25 }
26 virtual void excute() = 0 ;
27 virtual void setArgs( string arg) = 0 ;
28 public :
29 Receiver * rec;
30 };
31 class ConcreteCommand : public Command
32 {
33 public :
34 ConcreteCommand(Receiver * r):Command(r){};;
35 virtual void setArgs( string arg){
36 arg1 = arg;
37 }
38 public :
39 virtual void excute(){
40 rec -> action(arg1);
41 }
42 private :
43 string arg1;
44 };
45
46 int main()
47 {
48 Receiver * rec = new Receiver();
49 Command * cmd = new ConcreteCommand( rec );
50 cmd -> setArgs( " i am concretecommand " );
51 Invoker * in = new Invoker();
52 in -> cmd = cmd;
53 cmd -> excute();
54 return 0 ;
55 }
下面的代码,是保存命令接收者ID的方式,这种方式可以用于将不同命令纷发到各个模块(receiver)处理之类的需求。比如将客户端发向服务器的消息,发到各自的模块去处理。

 

 

命令中保存接收者ID
class Command;
class Receiver;

#include
< stdio.h >
#include
< string >
using namespace std;
class Receiver
{
public :
virtual void action( string str ) = 0 ;
public :
int receiverID;
virtual int getReceiverID() = 0 ;
};
class ReceiverManager
{
public :
enum { NORMAL = 0 };
public :
static ReceiverManager * getInstance(){
if ( ! instance ){
instance
= new ReceiverManager();
}
return instance;
}
void action( int id , string args){
receivers[id]
-> action(args);
}
private :
ReceiverManager(){};
~ ReceiverManager(){
if ( instance ){
delete instance ;
instance
= 0 ;
}
};
public :
Receiver
* receivers[ 100 ];
private :
static ReceiverManager * instance;
};
ReceiverManager
* ReceiverManager::instance = 0 ;

class Invoker
{
public :
Command
* cmd;
};
class Command
{
public :
Command(
int id){
receiverID
= id;
}
virtual void excute() = 0 ;
virtual void setArgs( string arg) = 0 ;
public :
int receiverID;
};
class ConcreteCommand : public Command
{
public :
ConcreteCommand(
int id ):Command(id){};;
virtual void setArgs( string arg){
arg1
= arg;
}
public :
virtual void excute(){
ReceiverManager
* manager = ReceiverManager::getInstance();
manager
-> action( receiverID ,arg1);
}
private :
string arg1;
};
class NormalReceiver: public Receiver
{
public :
NormalReceiver()
{
receiverID
= ReceiverManager::NORMAL;
}
public :
void action( string str ){
printf(
" %s excute command,and i am normalreceiver\n " ,str.c_str());
}
int getReceiverID(){
return receiverID;
}
};
int main()
{
Receiver
* rec = new NormalReceiver();
ReceiverManager
* manager = ReceiverManager::getInstance();
manager
-> receivers[rec -> getReceiverID()] = rec;
Command
* cmd = new ConcreteCommand( ReceiverManager::NORMAL);
cmd
-> setArgs( " this is concretecommand " );
Invoker
* in = new Invoker();
in -> cmd = cmd;
cmd
-> excute();
return 0 ;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值