Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31732
  • 博文数量: 9
  • 博客积分: 177
  • 博客等级: 入伍新兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-11 19:12
文章分类

全部博文(9)

文章存档

2011年(9)

我的朋友
最近访客

分类: C/C++

2011-10-04 23:43:21

案例:一个IT 项目小组通常有Requirement GroupPage GroupCode Group。通常还有一个项目经理。有一个甲方很厉害啊,他给Requirement Group 说了,我要添加一个功能。

 

定义一个Group

#ifndef _GROUP_H_
#define _GROUP_H_
class group
{
        public:
                virtual void find() = 0; //find rg or pg or cg
                virtual void add() = 0; //add func
                virtual void del() = 0; // del func
                virtual ~group(){};
};
#endif

定义Requirement Group Page Group Code Group三个类

#ifndef _CG_H_
#define _CG_H_
#include "group.h"
#include
class cg :public group
{
        public :
                void find(){std::cout<<"code group find"<                void add(){std::cout<<"code group add"<                void del(){std::cout<<"code group del"<                ~cg(){};
};
#endif

#ifndef _PG_H_
#define _PG_H_
#include "group.h"
#include
class pg :public group
{
        public :
                void find(){std::cout<<"page group find"<                void add(){std::cout<<"page group add"<                void del(){std::cout<<"page group del"<                ~pg(){};
};
#endif

#ifndef _RG_H_
#define _RG_H_
#include "group.h"
#include
class rg :public group
{
        public :
                void find(){std::cout<<"requirement find"<                void add(){std::cout<<"requirement add"<                void del(){std::cout<<"requirement del"<                ~rg(){};
};
#endif

 Main方法:

#include "cg.h"
#include "pg.h"
#include
int main()
{
        group *c = new cg;
        c->find();
        c->add();
        c->del();
        c = new pg;
        c->find();
        c->add();
        c->del();
}

 

甲方疯了,添加一个需求给需求组说了,那么页面组呢,代码组呢? 一个一个都通知一下?太麻烦了。这个任务还是给项目经理吧,项目经理执行添加需求命令,执行去吧。甲方省事了吧!

command.h:

#ifndef _COMMAND_H_
#define _COMMAND_H_
#include "cg.h"
#include "rg.h"
#include
class command
{
        public:
                virtual void exec() = 0 ;
                virtual ~command(){};
        protected:
                cg codegroup;
                rg requirementgroup;
};
#endif


addrequirement.h(concrete command)

#ifndef  _ADDREQUIREMENT_H_
#define _ADDREQUIREMENT_H_
#include "command.h"
class addrequirement: public command
{
        public:
                void exec()
                {
                        requirementgroup.find();
                        requirementgroup.add();
                };
                ~addrequirement(){};
};
#endif

main
#include "addrequirement.h"
#include "command.h"
#include
int main()
{
        command *add = new addrequirement;
        add->exec();
        return 0;
}

Command 优点:

1 类间解耦:调用者和执行者之间没有任何依赖关系,调用者只需要执行相应命令就可以了

2 可扩展性: Command的子类非常容易扩展,调用者(Invoker)和高层次的模块Client不产生严重的代码耦合。

3 命令模式可以结合其他模式,譬如模板方法模式,解决Command类膨胀的问题。

缺点:

N个命令,就有NCommand子类,膨胀太大了。

阅读(1347) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~