策略模式实现样例

本文深入探讨了策略模式的设计理念,通过实例展示了如何将一系列算法封装,使其可以互换使用,解决了因算法相似导致的if-else复杂性和维护难题。介绍了策略模式的实现方式,包括使用接口、模板类和函数指针等。
/*
定义一系列算法,并一个个封装,使之可以互相替换.是的算法独立于客户,或者说算法完成的功能是一样的.对外接口移植.只是各自实现上存在差异
主要解决:多种算法相似情况下使用if.else所带来的复杂和难以维护
使用时机:一个系统多个类,差异点只在于他们的直接行为
解决:将来算法封装成类可以任意替换
关键代码:实现同一个接口
缺点:1.策略类会增多,2.所有策略都需要对外暴露
*/

#ifndef MODE_STRATEGY_HPP
#define MODE_STRATEGY_HPP

#include<iostream>
using namespace std;

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(NULL!= m_hurt){
            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;

};

//使用函数指针实现策略模式
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>
#include<functional>

using namespace std;
class Bowman{
public:
    typedef function<void(int)> HurtFunc;

    Bowman(HurtFunc fun):m_fun(fun){

    }

    void beInjured(int num){
        m_fun(num);
    }

private:
    HurtFunc m_fun;
};


#endif // MODE_STRATEGY_HPP

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值