zoukankan      html  css  js  c++  java
  • 关于命令模式的一点意见

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

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

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

    保存指针方式
    1 class Command;
    2  class Receiver;
    3
    4 #include<stdio.h>
    5 #include<string>
    6 usingnamespace 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 virtualvoid excute() =0;
    27 virtualvoid 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 virtualvoid setArgs(string arg){
    36 arg1 = arg;
    37 }
    38 public:
    39 virtualvoid 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 return0;
    55 }
    下面的代码,是保存命令接收者ID的方式,这种方式可以用于将不同命令纷发到各个模块(receiver)处理之类的需求。比如将客户端发向服务器的消息,发到各自的模块去处理。
    命令中保存接收者ID
    class Command;
    class Receiver;

    #include
    <stdio.h>
    #include
    <string>
    usingnamespace std;
    class Receiver
    {
    public:
    virtualvoid action(string str )=0;
    public:
    int receiverID;
    virtualint 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;
    }
    virtualvoid excute() =0;
    virtualvoid setArgs(string arg) =0;
    public:
    int receiverID;
    };
    class ConcreteCommand : public Command
    {
    public:
    ConcreteCommand(
    int id ):Command(id){};;
    virtualvoid setArgs(string arg){
    arg1
    = arg;
    }
    public:
    virtualvoid 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();
    return0;
    }
  • 相关阅读:
    Jenkins系列——使用SonarQube进行代码质量检查
    HTTP1.0工作原理
    Jenkins系列——使用checkstyle进行代码规范检查
    Jenkins系列——定时构建
    Hadoop环境搭建
    eclipse3.4+对的处理插件(附SVN插件安装实例)
    MD5
    RedHat6.5更新软件源
    ubuntu软件推荐
    disconf系列【2】——解决zk部署情况为空的问题
  • 原文地址:https://www.cnblogs.com/fox7nights/p/2243844.html
Copyright © 2011-2022 走看看