上一周我介绍了桥接模式,这一周来介绍策略模式。
前言:
在游戏开发过程中,角色是必不可少的一个东西,而只要有角色,那么他就有自己对应的属性,比如性别、体重,这一类通常出现在休闲生活游戏中,而在战斗类型的游戏中,一般出现的是攻击力,暴击率,防御力,法术攻击力,生命值等等。比如现在A和B两个阵营的对手,A和B的属性各不相同,A是有概率抵挡一定伤害,B是有概率额外造成一定伤害。那么我们通常会怎么去写,我们通常可能就是,写一个枚举类型,包含A和B两个角色类型,然后写一个角色类型,在里面进行攻击力计算时候,利用switch选择不同的角色,来执行不同的计算方法。这一点是最容易想到和最容易实现的东西,在此里就不赘述,按照惯例,我们同样来讨论一下这样写的坏处。
1.这样写每一次修改一些属性或者增删一些属性,计算方法里面的但凡涉及到switch的必须修改,增加代码的维护难度。
2.因为计算肯定要先算攻击力再算防御力,第三个才是判断攻击到目标后,这样三个方法都有switch把同一个角色类型的计算过程,拆分成了几块儿,分散开了,不利于阅读代码。
那么这个时候,请出本场最佳——“策略模式”。
在GOF中对策略模式的定义如下:
“定义一组算法,并封装每一个算法,让他们彼此可以交换使用。策略模式让这些算法在客户端使用它们时候能更加独立。”
听着很绕口,没办法书面语言总是要有一些那么高端。
一张图搞定:

这样一看是不是就简单明了。再补上代码如下:
using System;
namespace 策略模式
{
public abstract class IA
{
public abstract void A();
}
public class B : IA
{
public override void A()
{
Console.WriteLine("执行B算法");
}
}
public class C : IA
{
public override void A()
{
Console.WriteLine("执行C算法");
}
}
public class D : IA
{
public override void A()
{
Console.WriteLine("执行D算法");
}
}
public class Context
{
IA my_iA = null;
public void Set(IA iA)
{
my_iA = iA;
}
public void Excute()
{
my_iA.A();
}
}
class Program
{
static void Main(string[] args)
{
Context context = new Context();
context.Set(new B());
context.Excute();
context.Set(new C());
context.Excute();
context.Set(new D());
context.Excute();
Console.ReadKey();
}
}
}
运行截图:
这就是策略模式,说白了,就是把switch这里的每一个判断拆开,之所以这样做是因为大部分实际开发不论是游戏开发还是其他的软件开发,switch判断时候不可能执行的简单的一个运算,就像什么商品收税大于多少是怎么算的,而是包含的很多子系统的交互,我们如果仍然写在里面,代码就会很难维护。
在我的总结篇会提一下之前涉及到的所有设计模式在游戏中一个应用思路。
至此以上就是本周的读书笔记。
本文探讨了策略模式在游戏开发中的应用,通过对比传统switch判断方式,指出了其在代码维护和阅读上的不足。引入策略模式,将不同角色的属性计算方法封装为独立的策略,提高代码灵活性和可读性。
1243

被折叠的 条评论
为什么被折叠?



