/*
定义一系列算法,并一个个封装,使之可以互相替换.是的算法独立于客户,或者说算法完成的功能是一样的.对外接口移植.只是各自实现上存在差异
主要解决:多种算法相似情况下使用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