Unity23种设计模式之 策略模式
·
1.什么是策略模式?
把一组算法封装成独立的类,让他们可以互相替换,算法的变化不影响使用算法的代码。
核心思想:
行为抽象从成策略接口,每种行为一个具体策略,使用方只依赖接口,不关心实现。
2.什么时候该用策略模式?
同一个逻辑多个实现,逻辑经常改,经常加,if/else或switch特别多
3.经典反例
public void Attack(int type)
{
if (type == 1)
{
// 普通攻击
}
else if (type == 2)
{
// 火焰攻击
}
else if (type == 3)
{
// 冰冻攻击
}
}
问题:新增攻击类型=改变方法,方法会越来越大,所有攻击耦合到一起。
4.策略模式的标准结构
Context(使用策略)
↓
Strategy(策略接口)
↓
ConcreteStrategyA / B / C(具体策略)
5.实战演示
//定义策略接口
public interface IAttackStrategy
{
void Attack(GameObject attacker, GameObject target);
}
//实现具体策略
public class NormalAttack : IAttackStrategy
{
public void Attack(GameObject attacker, GameObject target)
{
Debug.Log("普通攻击");
}
}
public class FireAttack : IAttackStrategy
{
public void Attack(GameObject attacker, GameObject target)
{
Debug.Log("火焰攻击,附加灼烧");
}
}
public class IceAttack : IAttackStrategy
{
public void Attack(GameObject attacker, GameObject target)
{
Debug.Log("冰冻攻击,减速");
}
}
//Context:角色使用策略
public class PlayerAttack : MonoBehaviour
{
private IAttackStrategy _attackStrategy;
public void SetStrategy(IAttackStrategy strategy)
{
_attackStrategy = strategy;
}
public void DoAttack(GameObject target)
{
_attackStrategy?.Attack(gameObject, target);
}
}
//使用示例
var player = GetComponent<PlayerAttack>();
player.SetStrategy(new FireAttack());
player.DoAttack(enemy);
player.SetStrategy(new IceAttack());
player.DoAttack(enemy);
6.常见使用场景
(1)AI行为
IAIBehavior
├── Patrol
├── Chase
└── Attack
(2)移动方式
IMoveStrategy
├── Walk
├── Fly
└── Teleport
(3)数值计算
伤害公式、暴击计算、结算规则
(4)UI表现策略
不同活动UI动画、不同主题展示逻辑
更多推荐
所有评论(0)