当前位置:网站首页>策略模式 - 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等,代码更简洁。
- 满足开闭原则,在扩展新算法时,无需更改客户端代码。
- 将业务逻辑和算法实现分离
缺点
- 使系统更复杂
- 客户端本身需要明白不同策略算法之间的区别
与其他模式的区别
- 桥接 和 策略 十分相似,且都是将任务委托给引用对象,但本质却不同,桥接注重将功能分离,通过抽象化类对各个实现化引用进行交互,来完成对应功能,本质是将各个功能组合成一个大的结构,且思想主要是通过组合的方式来替代继承完成抽象和实现的分离。策略模式注重的只有一个,那就是算法在运行中可以相互切换,且互不干扰,算法的实现和业务逻辑分离。
- 模板方法 和 策略 都是对算法不同实现。但思路不同,模板方法本身是在一个算法骨架上,对特定步骤进行重写,算法本身是有顺序的。而策略的算法实现,则可以完全不同,只要完成了特定任务即可。模板方法是类继承,而策略是对象组合。模板方法算法是静态的,而策略算法是动态的。
- 状态 和 策略 都是运行时的功能切换。状态的功能切换,主要是状态改变使得功能的切换,策略则是主动切换。状态没有明确功能实现和状态切换的分离,可以和策略模式配合,实现实现和切换的分离。
边栏推荐
- MRS离线数据分析:通过Flink作业处理OBS数据
- DNS series (I): why does the updated DNS record not take effect?
- [Seaborn] implementation of combined charts and multi subgraphs
- Mrs offline data analysis: process OBS data through Flink job
- LeetCode 1043. Separate the array to get the maximum and daily questions
- skimage学习(3)——使灰度滤镜适应 RGB 图像、免疫组化染色分离颜色、过滤区域最大值
- 电脑无法加域,ping域名显示为公网IP,这是什么问题?怎么解决?
- Skimage learning (3) -- gamma and log contrast adjustment, histogram equalization, coloring gray images
- QT 图片背景色像素处理法
- 【Seaborn】组合图表:FacetGrid、JointGrid、PairGrid
猜你喜欢
Seaborn data visualization
skimage学习(2)——RGB转灰度、RGB 转 HSV、直方图匹配
QT 图片背景色像素处理法
User defined view essential knowledge, Android R & D post must ask 30+ advanced interview questions
skimage学习(3)——使灰度滤镜适应 RGB 图像、免疫组化染色分离颜色、过滤区域最大值
Skimage learning (3) -- adapt the gray filter to RGB images, separate colors by immunohistochemical staining, and filter the maximum value of the region
skimage学习(3)——Gamma 和 log对比度调整、直方图均衡、为灰度图像着色
The top of slashdata developer tool is up to you!!!
Sator launched Web3 game "satorspace" and launched hoobi
麒麟信安操作系统衍生产品解决方案 | 存储多路径管理系统,有效提高数据传输可靠性
随机推荐
LeetCode 1981. Minimize the difference between the target value and the selected element one question per day
centos7安装mysql笔记
DevOps 的运营和商业利益指南
如何在博客中添加Aplayer音乐播放器
LeetCode 1774. The dessert cost closest to the target price is one question per day
What is cloud computing?
Skimage learning (3) -- gamma and log contrast adjustment, histogram equalization, coloring gray images
LeetCode 1986. The minimum working time to complete the task is one question per day
MRS离线数据分析:通过Flink作业处理OBS数据
LeetCode 1986. 完成任务的最少工作时间段 每日一题
Repair method of firewall system crash and file loss, material cost 0 yuan
NeRF:DeepFake的最终替代者?
mysql官网下载:Linux的mysql8.x版本(图文详解)
LeetCode 152. Product maximum subarray daily question
管理VDI的几个最佳实践
【黄啊码】为什么我建议您选择go,而不选择php?
第二十四届中国科协湖南组委会调研课题组一行莅临麒麟信安调研考察
Share the latest high-frequency Android interview questions, and take you to explore the Android event distribution mechanism
【源码解读】| LiveListenerBus源码解读
[Fantan] how to design a test platform?