策略模式

动机

  • 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些代码都编码到对象中,将使对象变得异常复杂
  • 如何在运行时根据需要透明的更改对象的算法?将对象与算法本身解耦,从而避免上述问题?

定义

  • 定义一系列算法,把它们一个一个封装起来,并且使它们可以互相替换(变化)。该模式使得算法独立于使用它的客户程序(稳定)而变化(扩展,子类化)

要点

  • 策略以及子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便的根据需要在各个算法之间进行切换
  • 策略模式提供了用条件判断语句以外的另一种选择,消除条件判断语句就是在解耦合。含有许多条件判断语句的代码通常需要策略模式
  • 如果策略对象没有实例,则各个上下文可以共享同一个对象,从而节省对象开销

坏示例

//某种类型的枚举
enum EType
{
    eType_0,
    eType_1,
    eType_2
};

//对不同的类型进行处理
class CTest0
{
public:
    //若新增了类型,则此函数无法维持稳定
    void Deal(const EType eTypeC)
    {
        if (eType_0 == eTypeC)
        {
            //...
        }
        else if (eType_1 == eTypeC)
        {
            //...
        }
        else if (eType_2 == eTypeC)
        {
            //...
        }
    }
};

策略模式示例

//定义一个类型基类
class CBaseType
{
public:
    virtual ~CBaseType(){}
    virtual void Deal() = 0;
};

//具体类型
class CType0 : public CBaseType
{
public:
    virtual void Deal()
    {
        //...
    }
};

//具体类型
class CType1 : public CBaseType
{
public:
    virtual void Deal()
    {
        //...
    }
};

class CTest1
{
public:
    //即使新增了具体类型,此函数仍然稳定
    void Deal(CBaseType* pType)
    {
        pType->Deal();
    }
};

https://www.bilibili.com/video/av24176315/?p=4

你可能感兴趣的:(策略模式)