【需求分析】
项目最近需要写一个逻辑srv,srv的业务逻辑比较简单,收包、解包、根据命令字进行业务处理、回包。 考虑每一次请求都是一项任务,而逻辑srv是一个任务管理器,这样我们就有两个类,TaskMng和Task, TaskMng只负责大的业务逻辑, 而Task做为一个具体业务处理类,需要根据命令字进行不同的业务处理。需要关注的是所有的task都有一些共同点,如收包、解包、检查包的合法性等,因此可以把task定义为基类,并实现通用的部分,而把业务逻辑相关特殊的部分放到子类里去实现。
上面的实现就是“策略模式”,策略模式是一种行为模式,主要是把定义一系列的算法,并封装到算法类中,通过把策略独立出来,通过继承的方式实例化多个策略,在客户类中维护一个指向策略父类的引用,在运行时即可动态改变引用指向的子策略从而实现我们的需求。
【代码举例】
通过对需求的分析,可以写出下面的代码实现。
class Task
{
public:
Task();
~Task();
public:
Decode();
Encode();
Process();
};
class TaskLogicA : Task
{
public:
Process();
}
class TaskLogicB : Task
{
public:
Process();
}
class TaskMng
{
public:
TaskMng();
~TaskMng();
public:
int Run(int cmd);
private:
Task *m_task;
};
int TaskMng::Run(int cmd)
{
switch(cmd)
{
case 1:
m_task = new TaskLogicA();
break;
case 2:
m_task = new TaskLogicB();
break;
default:
m_task = new Task();
break;
}
m_task->Decode();
m_task->Process();
m_task->Encode();
delete m_task;
}