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动画、不同主题展示逻辑

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐