当前位置: 首页 > news >正文

策 略 模 式

说起来,我们在玩《黑神话:悟空》的时候一共有三种棍法可以选择:劈棍、立棍和戳棍。当我带着劈棍法赶路时,突然四面八方来了一群小怪,这时我急中生智切换到了立棍法,一个风云转再接江海翻,对手被尽数消灭。当我准备拍拍屁股走人,突然发现有个小妖在逃跑!我直接掏出戳棍法,千里之外取其性命……

没错,不同的棍法就相当于我们不同的对敌策略,我们能够灵活地在不同场合下切换策略。蕴含这种思想的设计模式叫做策略模式(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;
}

总的来说,策略模式拥有算法切换自由的优势,新增算法只需要新建策略类即可,扩展性良好,符合开闭原则。但是用户在使用时需要知道策略类的名字,同时每增加一个策略,需要重新写一个类,算是个小缺点。


小结

策略模式看起来结构很简单,但其对于游戏开发是有重要意义的。这种设计模式极大地提高了游戏中各个系统的可扩展性和多样性。同时简化了复杂的逻辑,让代码清晰,也可以提高团队开发的效率。而且其作为行为型设计模式,还可以结合工厂模式使用,让代码更灵活!

如有补充纠正欢迎留言。

相关文章:

  • 马铃薯土豆幼苗与杂草检测数据集VOC+YOLO格式3051张2类别
  • cursor 如何在项目内自动创建规则
  • CSDN博客粘贴图片失败如何解决
  • 网络编程epoll和udp
  • 联想 SR550 服务器,配置 RAID 5教程!
  • CSRF记录
  • Megatron系列——张量并行
  • Clang实现C++文件分析,含Python实战
  • 嵌入式系统:从基础到应用的全面解析
  • MySQL 备份与恢复
  • Linux环境下安装MySQL
  • 5月12日复盘-RNN
  • 1.8 梯度
  • uni-app学习笔记五--vue3插值表达式的使用
  • 龙虎榜——20250512
  • 硬件设备基础
  • Claude深度解析:从技术原理到实战应用的全栈指南
  • Model.eval() 与 torch.no_grad() PyTorch 中的区别与应用
  • 接口自动化测试调研--python自动化
  • 状态压缩动态规划:用二进制“魔法”破解组合难题
  • 成都警方通报:8岁男孩落水父母下水施救,父亲遇难
  • 上海北外滩开发建设五周年交出亮眼答卷,未来五年有何新目标?
  • 技术派|更强的带刀侍卫:从054B型战舰谈谈世界护卫舰发展
  • 茅台1935今年动销达到预期,暂无赴港上市计划!茅台业绩会回应多个热点
  • 国羽用冠军开启奥运周期,林丹:希望洛杉矶奥运取得更好成绩
  • 全球医药股普跌,A股创新药板块下挫