• 【设计模式】策略模式


     

     策略模式

    关于策略模式,我的理解:有若干个策略(算法),有一个管理策略的类,该类的输入为策略,输入为不同的策略(算法),输出为该种策略(算法)对应的类对象(的动态类型),然后程序员手动去使用该类对象(的动态类型)去调用相应虚函数,根据多态机制实现执行不同的操作。

      

    /************************************************************************
    设计模式2
    策略模式
    
    我们知道,一个公司里有若干个工种,每个工种做的工作是不同的,每种不同的工作
    就可以看作是一个一个的策略(算法),以此为例来描述策略模式。
    
    本文中有一个抽象基类【干活】类,三个子类【软件开发】、【市场拓展】
    【数据处理】,每个子类代表一种操作,一种算法,几种策略
    
    有一个用来管理各种策略的【TodoContext】上下文类,在此类中获取输入的策略的
    实际动态类型,在此类对外提给客户的接口中调用了该抽象基类(指针),去调用
    其虚函数完成操作。
    
    
    ************************************************************************/
    //【干活】抽象基类
    class CDoSomething
    {
    public:
        CDoSomething();
        virtual void DoSomething() const = 0; 
        virtual ~CDoSomething();
    };
    
    CDoSomething::CDoSomething(){}
    
    void CDoSomething::DoSomething()  const
    {
        //do nothing
    }
    
    CDoSomething::~CDoSomething()
    //【软件开发】类
    class CSoftDevelop : public CDoSomething
    {
    public: 
        CSoftDevelop();
        virtual void DoSomething() const;
        virtual ~CSoftDevelop();
    };
    
    CSoftDevelop::CSoftDevelop() {}
    
    void CSoftDevelop::DoSomething() const
    {
        cout << "
    研发部去写代码去,快去! 滚!
    ";
    }
    
    CSoftDevelop::~CSoftDevelop(){}
    //【市场拓展】类
    class CBusinessDevelop : public CDoSomething
    {
    public: 
        CBusinessDevelop();
        virtual void DoSomething() const;
        virtual ~CBusinessDevelop();
    };
    
    CBusinessDevelop::CBusinessDevelop() {}
    
    void CBusinessDevelop::DoSomething() const
    {
        cout << "
    市场部的兄弟们,最近业绩怎么样啊?什么?那还不快滚去出差!滚!
    ";
    }
    
    CBusinessDevelop::~CBusinessDevelop(){}
    //【数据处理】 类
    class CDataHandle : public CDoSomething
    {
    public:
        CDataHandle( );
        virtual void DoSomething() const;
        virtual ~CDataHandle();
    };
    
    CDataHandle::CDataHandle() {}
    
    void CDataHandle::DoSomething() const
    {
        cout << "
    数据处理部的,模型做完了吗? 什么?还差点? 还不快加班做! 滚!
    ";
    }
    
    CDataHandle::~CDataHandle(){}

    用来管理各种策略(算法,干什么活)的上下文类

    //【ToDo上下文】类
    class CTodoContext 
    {
    public:
        //构造函数的参数为一个【干活】类指针,即一个策略(算法,干什么活)
        CTodoContext(CDoSomething* ptr);
        void DoSomething();  //此函数非虚,和【干活】类及其子类没有关系
    
        virtual ~CTodoContext();
    
    protected:
        CDoSomething* m_ptrDoSomething;
    };
    
    CTodoContext::CTodoContext(CDoSomething* ptr)
    {
        m_ptrDoSomething = ptr;
    }
    
    void CTodoContext::DoSomething()
    {
        if (NULL != m_ptrDoSomething) 
            m_ptrDoSomething->DoSomething(); 
    }
    
    CTodoContext::~CTodoContext()
    {
        if(NULL != m_ptrDoSomething) delete m_ptrDoSomething;
    }

    main函数及执行结果如下

     

    下一篇文章写写【策略模式】和【简单工厂模式】的结合

      

     

     

  • 相关阅读:
    CreateRemoteThread注入DLL
    远程线程注入引出的问题
    jQuery中排除指定元素,同时选择剩下的所有元素
    YUIDoc的使用方法小结
    实验二 栈和队列的应用
    实验一 线性表的基本操作
    最大子段和详解
    HDOJ 1995 汉诺塔V
    错排公式 详细解答
    HDOJ 2212 DFS
  • 原文地址:https://www.cnblogs.com/cuish/p/3724044.html
Copyright © 2020-2023  润新知