当前位置:网站首页>策略模式 - Unity

策略模式 - Unity

2022-07-07 15:38:00 有趣就行

策略模式

策略模式是一种对象行为型模式。该模式定义一系列算法,将其封装起来,使这些算法在完成特定任务时,可以相互替换。 通过一个情景类,将其算法实现和业务逻辑分离,动态的切换不同的算法进行管理。

策略模式在生活中也十分常见,如出行的方式,当需要到达一个目的地时,我们需要一个方式去实现,骑车,坐公交等,它们都是实现了同一个任务,但实现的方式截然不同。在程序中,排序是非常常见的,不同的排序方式有不同的特定(如快排,归排,堆排等),通过不同的场景,我们可以灵活的选择这些排序。

结构

在这里插入图片描述
说明

  • 抽象策略(IStrategy)- 声明算法的通用接口,将算法实现委派给子类。
  • 具体策略(Concrete Strategy)- 实现具体算法。
  • 情景(Context)- 依赖策略引用,不实现功能,负责调用策略接口的方法。

算法本身需要具备独立性

实现

例子:场景切换(Scene Switching)

场景切换(抽象策略)

    public interface ISceneSwitch
    {
    
        void SceneSwitch();
    }

切换算法(具体策略)

	//褪色切换
    public class FadeSwitch : ISceneSwitch
    {
    
        public void SceneSwitch()
        {
    
            Debug.Log("Scene Fade Switch");
        }
    }
    //圆型切换
    public class CircularSwitch : ISceneSwitch
    {
    
        public void SceneSwitch()
        {
    
            Debug.Log("Circular Scene Switch");
        }
    }

场景(情景)

    public class Scene
    {
    
        private ISceneSwitch _sceneSwitch;

        public ISceneSwitch SceneSwitch
        {
    
            set => _sceneSwitch = value;
        }
        
        public Scene(ISceneSwitch sceneSwitch)
        {
    
            _sceneSwitch = sceneSwitch;
        }

        public void SceneSwitching()
        {
    
            _sceneSwitch.SceneSwitch();
        }
    }

调用

    public class StrategyExample : MonoBehaviour
    {
    
        private void Start()
        {
    
            Scene scene = new Scene(new FadeSwitch());
            scene.SceneSwitching();

            scene.SceneSwitch = new CircularSwitch();
            scene.SceneSwitching();
        }
    }

在这里插入图片描述

应用场景

  • 客户端需要动态切换算法时,且不同算法实现一个特定任务
  • 当使用大量的条件分支语句来执行任务时,我们可以使用策略模式
  • 算法本身需要与业务逻辑分离,且算法实现不依赖上下文

优缺点

优点

  • 避免使用多重分支语句,如if…else,switch…case等,代码更简洁。
  • 满足开闭原则,在扩展新算法时,无需更改客户端代码。
  • 将业务逻辑和算法实现分离

缺点

  • 使系统更复杂
  • 客户端本身需要明白不同策略算法之间的区别

与其他模式的区别

  • 桥接策略 十分相似,且都是将任务委托给引用对象,但本质却不同,桥接注重将功能分离,通过抽象化类对各个实现化引用进行交互,来完成对应功能,本质是将各个功能组合成一个大的结构,且思想主要是通过组合的方式来替代继承完成抽象和实现的分离。策略模式注重的只有一个,那就是算法在运行中可以相互切换,且互不干扰,算法的实现和业务逻辑分离
  • 模板方法策略 都是对算法不同实现。但思路不同,模板方法本身是在一个算法骨架上,对特定步骤进行重写,算法本身是有顺序的。而策略的算法实现,则可以完全不同,只要完成了特定任务即可。模板方法是类继承,而策略是对象组合。模板方法算法是静态的,而策略算法是动态的。
  • 状态策略 都是运行时的功能切换。状态的功能切换,主要是状态改变使得功能的切换,策略则是主动切换。状态没有明确功能实现和状态切换的分离,可以和策略模式配合,实现实现和切换的分离。
原网站

版权声明
本文为[有趣就行]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_52361859/article/details/125212397