策略模式
策略模式是指对象有某个行为,但是在不同的场景下,该行为有不同的处理方式。比如说玩游戏打Boss,打败不同的Boss程序会做出不同的奖励。
#pragma once
#include <iostream>
#include <Windows.h>
using namespace std;
//打败Boss处理基类
class Beat_Boss
{
public:
virtual void Handle() = NULL;
};
//具体打败Boss_A处理子类
class Beat_Boss_A : public Beat_Boss
{
public:
virtual void Handle(){ cout << "打败BossA,掉落紫装" << endl;}
};
//具体打败Boss_B处理子类
class Beat_Boss_B : public Beat_Boss
{
public:
virtual void Handle(){ cout << "打败BossB,掉落神装" << endl;}
};
//策略工厂
class Strategy_Factory
{
public:
Strategy_Factory(Beat_Boss* param):boss(param){}
int Do()
{
if(NULL == boss)
{
cout << "请先注册执行策略" << endl;
return 0;
}
boss->Handle();
return 1;
}
int Set(Beat_Boss* param)
{
if(param != this->boss)
{
boss = param;
return 1;
}
return 0;
}
private:
// 聚合\组合 应该执行的策略
Beat_Boss* boss;
};
int main()
{
//选择A策略
Beat_Boss_A* Boss_A = new Beat_Boss_A;
Strategy_Factory factory(Boss_A);
factory.Do();
//选择B策略
Beat_Boss_B* Boss_B = new Beat_Boss_B;
factory.Set(Boss_B);
factory.Do();
system("pause");
return 1;
}
优点
1.在策略类大家庭中,虽然实现算法功能存在差异,但是公共部分可以放到父类实现,通过继承减轻代码的冗余。
2.避免了像简单工厂模式那样通过多重判断来选择使用哪一个类。
缺点
客户端必须知道所有的策略类,并自行决定使用哪一个策略类。也就是说策略类暴露给了客户端。