in Software engineering 设计模式 ~ read.
【设计模式】策略模式

【设计模式】策略模式

定义算法家族,分别封装起来,让它们之间可以互相替换完成相同的工作,仅仅是算法的实现不同,让算法变化,不会影响到用户的调用方式。

优劣

GOOD:适合类中的成员以方法为主,算法经常变动;简化了单元测试(因为每个算法都有自己的类,可以通过自己的接口单独测试。

策略模式和简单工厂基本相同,但简单工厂模式只能解决对象创建问题,对于经常变动的算法应使用策略模式。

BUG:客户端要做出判断

使用环境

• 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
• 一个系统需要动态地在几种算法中选择一种。
• 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
• 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。

参考代码

//策略基类
class COperation
{
  public:
    int m_nFirst;
    int m_nSecond;
    virtual double GetResult()
    {
        double dResult = 0;
        return dResult;
    }
};
//策略具体类—加法类
class AddOperation : public COperation
{
  public:
    AddOperation(int a, int b)
    {
        m_nFirst = a;
        m_nSecond = b;
    }
    virtual double GetResult()
    {
        return m_nFirst + m_nSecond;
    }
};
class Context
{
  private:
    COperation *op;
 
  public:
    Context(COperation *temp)
    {
        op = temp;
    }
    double GetResult()
    {
        return op->GetResult();
    }
};
//客户端
int main()
{
    int a, b;
    char c;
    cin >> a >> b;
    cout << "请输入运算符:";
    cin >> c;
    switch (c)
    {
    case '+':
        Context *context = new Context(new AddOperation(a, b));
        cout << context->GetResult() << endl;
        break;
    default:
        break;
    }
    return 0;
}

注意

纯策略模式不好,一般使用时,都是策略与工厂模式结合的方式。