策 略 模 式
说起来,我们在玩《黑神话:悟空》的时候一共有三种棍法可以选择:劈棍、立棍和戳棍。当我带着劈棍法赶路时,突然四面八方来了一群小怪,这时我急中生智切换到了立棍法,一个风云转再接江海翻,对手被尽数消灭。当我准备拍拍屁股走人,突然发现有个小妖在逃跑!我直接掏出戳棍法,千里之外取其性命……
没错,不同的棍法就相当于我们不同的对敌策略,我们能够灵活地在不同场合下切换策略。蕴含这种思想的设计模式叫做策略模式(Strategy)。
介绍
策略模式是一种行为型设计模式,其定义是:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
这样一来,当一组类中互相的区别只有行为差异的时候,策略模式的作用就变得十分强大了。例如黑神话中不同的棍法切换后,武器没变、攻击目标没变等等都没有变,只有攻击方式等少数行为发生了改变,那么就把不同的攻击方式都拿出来封装在一个接口下,实现不同的具体类,这样就可以通过策略模式灵活切换攻击方式的算法了。
总的来说,实现策略模式一共有三个角色:
1、抽象策略类:统一具体测量的接口,规范标准。
2、具体策略类:封装具体的策略行为。
3、上下文类:“上下文”指的就是策略执行的场景,负责集中管理策略的行为。这样一来,客户端只需要与上下文类进行交互,解耦了客户端与具体策略。
实现
光说不练假把式,接下来我就用C++简单模拟一下棍式切换该如何用策略模式实现。
在这个场景中,抽象策略类是“攻击方式”,具体策略类有“劈棍”、“立棍”和“戳棍”,分别封装各自的独特重击和技能。
#include <iostream>
using namespace std;/*抽象策略类*/
class AttackStrategy {
public:virtual ~AttackStrategy(){}//重击接口virtual void thump() = 0;//技能接口virtual void skill() = 0;
};
/*具体策略类*/
//劈棍
class PiGun : public AttackStrategy {
public:void thump() {cout << "腾空而起,高举棍子,向你劈去。" << endl;}void skill() {cout << "破棍式!斩棍式!" << endl;}~PiGun() {};
};
//立棍
class LiGun : public AttackStrategy {
public:void thump() {cout << "立起棍子,爬到顶端,向你砸去。" << endl;}void skill() {cout << "风云转!江海翻!" << endl;}~LiGun() {};
};
//戳棍
class ChuoGun : public AttackStrategy {
public:void thump() {cout << "后撤一步,蓄势待发,向你捅去。" << endl;}void skill() {cout << "退寸!进尺!" << endl;}~ChuoGun() {};
};
/*上下文类*/
class Battle {
private://指针指向策略,名为“棍式”AttackStrategy* gunShi;
public://初始化为空指针Battle() : gunShi(nullptr){}//设置棍式策略void setGunShi(AttackStrategy* way) {//先处理旧的if (gunShi != nullptr) {delete gunShi;}gunShi = way;}//执行棍式策略void exeThump() {if (gunShi != nullptr) {gunShi->thump();}}void exeSkill() {if (gunShi != nullptr) {gunShi->skill();}}
};
int main() {//创建上下文类实例Battle battle;//使用劈棍battle.setGunShi(new PiGun);battle.exeThump();battle.exeSkill();//使用立辊battle.setGunShi(new LiGun);battle.exeThump();battle.exeSkill();//使用戳棍battle.setGunShi(new ChuoGun);battle.exeThump();battle.exeSkill();return 0;
}
总的来说,策略模式拥有算法切换自由的优势,新增算法只需要新建策略类即可,扩展性良好,符合开闭原则。但是用户在使用时需要知道策略类的名字,同时每增加一个策略,需要重新写一个类,算是个小缺点。
小结
策略模式看起来结构很简单,但其对于游戏开发是有重要意义的。这种设计模式极大地提高了游戏中各个系统的可扩展性和多样性。同时简化了复杂的逻辑,让代码清晰,也可以提高团队开发的效率。而且其作为行为型设计模式,还可以结合工厂模式使用,让代码更灵活!
如有补充纠正欢迎留言。