前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战设计模式系列-Strategy(策略)

实战设计模式系列-Strategy(策略)

作者头像
王亚昌
发布2018-08-03 14:58:57
2200
发布2018-08-03 14:58:57
举报
文章被收录于专栏:王亚昌的专栏王亚昌的专栏

【需求分析】

    项目最近需要写一个逻辑srv,srv的业务逻辑比较简单,收包、解包、根据命令字进行业务处理、回包。 考虑每一次请求都是一项任务,而逻辑srv是一个任务管理器,这样我们就有两个类,TaskMng和Task, TaskMng只负责大的业务逻辑, 而Task做为一个具体业务处理类,需要根据命令字进行不同的业务处理。需要关注的是所有的task都有一些共同点,如收包、解包、检查包的合法性等,因此可以把task定义为基类,并实现通用的部分,而把业务逻辑相关特殊的部分放到子类里去实现。

    上面的实现就是“策略模式”,策略模式是一种行为模式,主要是把定义一系列的算法,并封装到算法类中,通过把策略独立出来,通过继承的方式实例化多个策略,在客户类中维护一个指向策略父类的引用,在运行时即可动态改变引用指向的子策略从而实现我们的需求。

【代码举例】

    通过对需求的分析,可以写出下面的代码实现。

代码语言:javascript
复制
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;  
}  
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年04月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档