做项目时遇到场景:hp>50&&level>10 kill(100)&&time<60
如果是用一堆if-else 或者 switch写的,那么需要了解一下适配器模式
1.适配器模式是什么?
给定一门语言,定义它的文法表示,并定义一个解释器,用来解释语言中的句子。
2.实战
目标:实现一个技能释放条件系统
cs
level >= 10 && hp > 50
(1)上下文(Context)
cs
public class SkillContext
{
public int Level;
public int Hp;
}
(2)抽象表达式
所有表达式都实现这个接口
cs
public interface IExpression
{
bool Interpret(SkillContext context);
}
(3)终结符表达式(最小规则)
cs
//等级条件
public class LevelExpression : IExpression
{
private int _needLevel;
public LevelExpression(int needLevel)
{
_needLevel = needLevel;
}
public bool Interpret(SkillContext context)
{
return context.Level >= _needLevel;
}
}
cs
//血量条件
public class HpExpression : IExpression
{
private int _needHp;
public HpExpression(int needHp)
{
_needHp = needHp;
}
public bool Interpret(SkillContext context)
{
return context.Hp > _needHp;
}
}
(4)非终结表达式
cs
public class AndExpression : IExpression
{
private IExpression _left;
private IExpression _right;
public AndExpression(IExpression left, IExpression right)
{
_left = left;
_right = right;
}
public bool Interpret(SkillContext context)
{
return _left.Interpret(context) && _right.Interpret(context);
}
}
(5)使用实例
cs
void TestSkillCondition()
{
SkillContext context = new SkillContext()
{
Level = 12,
Hp = 80
};
IExpression condition =
new AndExpression(
new LevelExpression(10),
new HpExpression(50)
);
bool canUseSkill = condition.Interpret(context);
Debug.Log("是否可释放技能:" + canUseSkill);
}
3.优缺点
优点:规则高度解耦,新增规则只需加类,不动老逻辑,非常适合策划配置话、可组合拓展
缺点:类数量容易爆炸