当前位置:网站首页>策略模式 - 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等,代码更简洁。
- 满足开闭原则,在扩展新算法时,无需更改客户端代码。
- 将业务逻辑和算法实现分离
缺点
- 使系统更复杂
- 客户端本身需要明白不同策略算法之间的区别
与其他模式的区别
- 桥接 和 策略 十分相似,且都是将任务委托给引用对象,但本质却不同,桥接注重将功能分离,通过抽象化类对各个实现化引用进行交互,来完成对应功能,本质是将各个功能组合成一个大的结构,且思想主要是通过组合的方式来替代继承完成抽象和实现的分离。策略模式注重的只有一个,那就是算法在运行中可以相互切换,且互不干扰,算法的实现和业务逻辑分离。
- 模板方法 和 策略 都是对算法不同实现。但思路不同,模板方法本身是在一个算法骨架上,对特定步骤进行重写,算法本身是有顺序的。而策略的算法实现,则可以完全不同,只要完成了特定任务即可。模板方法是类继承,而策略是对象组合。模板方法算法是静态的,而策略算法是动态的。
- 状态 和 策略 都是运行时的功能切换。状态的功能切换,主要是状态改变使得功能的切换,策略则是主动切换。状态没有明确功能实现和状态切换的分离,可以和策略模式配合,实现实现和切换的分离。
边栏推荐
- The computer cannot add a domain, and the Ping domain name is displayed as the public IP. What is the problem? How to solve it?
- Flask搭建api服务
- skimage学习(1)
- 鲲鹏开发者峰会2022 | 麒麟信安携手鲲鹏共筑计算产业新生态
- Linux 安装mysql8.X超详细图文教程
- LeetCode 1774. The dessert cost closest to the target price is one question per day
- Lex & yacc of Pisa proxy SQL parsing
- Flask搭建api服务-生成API文档
- Skimage learning (3) -- adapt the gray filter to RGB images, separate colors by immunohistochemical staining, and filter the maximum value of the region
- LeetCode 1186. 删除一次得到子数组最大和 每日一题
猜你喜欢
【视频/音频数据处理】上海道宁为您带来Elecard下载、试用、教程
PLC: automatically correct the data set noise, wash the data set | ICLR 2021 spotlight
Matplotlib绘制三维图形
How to add aplayer music player in blog
QT 图片背景色像素处理法
Sator推出Web3游戏“Satorspace” ,并上线Huobi
【Seaborn】组合图表:FacetGrid、JointGrid、PairGrid
[video / audio data processing] Shanghai daoning brings you elecard download, trial and tutorial
skimage学习(2)——RGB转灰度、RGB 转 HSV、直方图匹配
Share the latest high-frequency Android interview questions, and take you to explore the Android event distribution mechanism
随机推荐
How to add aplayer music player in blog
测试用例管理工具推荐
Solidity函数学习
LeetCode 1626. The best team without contradiction
字符串 - string(Lua)
LeetCode 1696. 跳跃游戏 VI 每日一题
【Seaborn】组合图表:FacetGrid、JointGrid、PairGrid
Is AI more fair than people in the distribution of wealth? Research on multiplayer game from deepmind
Skimage learning (2) -- RGB to grayscale, RGB to HSV, histogram matching
Skimage learning (1)
科普达人丨一文弄懂什么是云计算?
The mail server is listed in the blacklist. How to unblock it quickly?
LeetCode 1981. 最小化目标值与所选元素的差 每日一题
AI来搞财富分配比人更公平?来自DeepMind的多人博弈游戏研究
【Seaborn】组合图表、多子图的实现
Skimage learning (3) -- adapt the gray filter to RGB images, separate colors by immunohistochemical staining, and filter the maximum value of the region
With the latest Alibaba P7 technology system, mom doesn't have to worry about me looking for a job anymore
专精特新软件开发类企业实力指数发布,麒麟信安荣誉登榜
Jenkins发布uniapp开发的H5遇到的问题
On Apache Doris Fe processing query SQL source code analysis