策略模式

定义:  

   是指定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。使得算法可以独立于使用它的客户而变化,也就是说这些算法所完成的功能是一样的,对外接口是一样的,只是各自现实上存在差异。

意图:

   定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:

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

何时使用:

    一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:

    将这些算法封装成一个一个的类,任意地替换。

关键代码:

    实现同一个接口。

 缺点: 

     1、策略类会增多。 

     2、所有策略类都需要对外暴露。

//传统策略模式实现  
class Hurt  
{  
public:  
    virtual void redBuff() = 0;  
};  
  
class AdcHurt:public Hurt  
{  
public:  
    void redBuff()  
    {  
        cout << "Adc hurt" << endl;  
    }  
};  
  
class ApcHurt:public Hurt  
{  
public:  
    void redBuff()  
    {  
        cout << "Apc hurt" << endl;  
    }  
};  
  
//方法1:传入一个指针参数  
class Soldier  
{  
public:  
    Soldier(Hurt* hurt):m_hurt(hurt)  
    {  
    }  
    ~Soldier()  
    {  
    }  
    void beInjured()  
    {  
        m_hurt->redBuff();  
    }  
private:  
    Hurt* m_hurt;  
};  
  
//方法2:传入一个参数标签  
typedef enum  
{  
    adc,  
    apc  
}HurtType;  
  
class Master  
{  
public:  
    Master(HurtType type)  
    {  
        switch(type)  
        {  
        case adc:  
            m_hurt = new AdcHurt;  
            break;  
        case apc:  
            m_hurt = new ApcHurt;  
            break;  
        default:  
            m_hurt = NULL;  
            break;  
        }  
    }  
    ~Master()  
    {  
    }  
    void beInjured()  
    {  
        if(m_hurt != NULL)  
        {  
            m_hurt->redBuff();  
        }  
        else  
        {  
            cout << "Not hurt" << endl;  
        }  
    }  
private:  
    Hurt* m_hurt;  
};  
  
//方法3:使用模板类  
template <typename T>  
class Tank  
{  
public:  
    void beInjured()  
    {  
        m_hurt.redBuff();  
    }  
private:  
    T m_hurt;  
};  
//END  
  
//使用函数指针实现策略模式  
void adcHurt(int num)  
{  
    cout << "adc hurt:" << num << endl;  
}  
  
void apcHurt(int num)  
{  
    cout << "apc hurt:" << num << endl;  
}  
  
//普通函数指针  
class Aid  
{  
public:  
    typedef void (*HurtFun)(int);  
      
    Aid(HurtFun fun):m_fun(fun)  
    {  
    }  
    void beInjured(int num)  
    {  
        m_fun(num);  
    }  
private:  
    HurtFun m_fun;  
};  
  
//使用std::function , 头文件:#include<functional>  
class Bowman  
{  
public:  
    typedef std::function<void(int)> HurtFunc;  
  
    Bowman(HurtFunc fun):m_fun(fun)  
    {  
    }  
    void beInjured(int num)  
    {  
        m_fun(num);  
    }  
  
private:  
    HurtFunc m_fun;  
};  
//END  

参考:

https://www.yuque.com/docs/share/30354a69-c916-419e-98c9-6f62c54b269f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值