行为型模式—策略模式

一、使用场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

4、最直观的理解是对象内部执行行为较多,传统的方法是使用条件分支, 如果摸个分支发生了变化,就需要更改对象的内部实现方式,在策略模式中则不需要。

5、常用在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护

二、实现方法

例如:对两个操作数进行的计算操作,计算两个数的加、减、乘、除,使用条件分支,代码编写如下

class COPerate
{
public:
    int Operate(int num1, int num2, std::string & op)
    {
        if("+" == op)
        {
            return num1 + num2;
        }
        else if("-" == op)
        {
            return num1 - num2;
        }
        else if("*" == op)
        {
            return num1*num2;
        }
        else if("/" == op)
        {
            return num1/num2;
        }
    }
}
class IOp
{
public:
    virtual int Operate(int num1, int num2) = 0;
}

class CAdd : public IOp
{
public:
    int Operate(int num1, int num2)
    {
        return num1 + num2;
    }
}

class CSub : public IOp
{
public:
    int Operate(int num1, int num2)
    {
        return num1 - num2;
    }
}

class CMul : public IOp
{
public:
    int Operate(int num1, int num2)
    {
        return num1 * num2;
    }
}

class CDiv : public IOp
{
public:
    int Operate(int num1, int num2)
    {
        return num1 / num2;
    }
}

class COPerate
{
public:
    void init();
    {
        m_pOpreateMap.insert(std::make_pair("Add"), (new CAdd()));
        m_pOpreateMap.insert(std::make_pair("Sub"), (new CSub()));
        m_pOpreateMap.insert(std::make_pair("Mul"), (new CMul()));
        m_pOpreateMap.insert(std::make_pair("Div"), (new CDiv()));
    }

    int Operate(int num1, int num2, std::string & op)
    {
       int ret;
       auto it = m_pOpreateMap.find(op);
       if (m_pOpreateMap.end() != it)
       {
           ret = it->second->Operate(num1, num2);
       }
       return ret;
    }

std::map<std::string, IOp*>m_pOpreateMap;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值