当前位置:网站首页>策略模式 - 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等,代码更简洁。
- 满足开闭原则,在扩展新算法时,无需更改客户端代码。
- 将业务逻辑和算法实现分离
缺点
- 使系统更复杂
- 客户端本身需要明白不同策略算法之间的区别
与其他模式的区别
- 桥接 和 策略 十分相似,且都是将任务委托给引用对象,但本质却不同,桥接注重将功能分离,通过抽象化类对各个实现化引用进行交互,来完成对应功能,本质是将各个功能组合成一个大的结构,且思想主要是通过组合的方式来替代继承完成抽象和实现的分离。策略模式注重的只有一个,那就是算法在运行中可以相互切换,且互不干扰,算法的实现和业务逻辑分离。
- 模板方法 和 策略 都是对算法不同实现。但思路不同,模板方法本身是在一个算法骨架上,对特定步骤进行重写,算法本身是有顺序的。而策略的算法实现,则可以完全不同,只要完成了特定任务即可。模板方法是类继承,而策略是对象组合。模板方法算法是静态的,而策略算法是动态的。
- 状态 和 策略 都是运行时的功能切换。状态的功能切换,主要是状态改变使得功能的切换,策略则是主动切换。状态没有明确功能实现和状态切换的分离,可以和策略模式配合,实现实现和切换的分离。
边栏推荐
- Sator a lancé le jeu web 3 "satorspace" et a lancé huobi
- PLC:自动纠正数据集噪声,来洗洗数据集吧 | ICLR 2021 Spotlight
- 麒麟信安操作系统衍生产品解决方案 | 存储多路径管理系统,有效提高数据传输可靠性
- QT中自定义控件的创建到封装到工具栏过程(一):自定义控件的创建
- PLC: automatically correct the data set noise, wash the data set | ICLR 2021 spotlight
- Share the latest high-frequency Android interview questions, and take you to explore the Android event distribution mechanism
- 浅谈 Apache Doris FE 处理查询 SQL 源码解析
- 字符串 - string(Lua)
- LeetCode 1626. 无矛盾的最佳球队 每日一题
- LeetCode 1155. 掷骰子的N种方法 每日一题
猜你喜欢
A tour of grpc:03 - proto serialization / deserialization
skimage学习(3)——Gamma 和 log对比度调整、直方图均衡、为灰度图像着色
测试用例管理工具推荐
Process from creation to encapsulation of custom controls in QT to toolbar (I): creation of custom controls
管理VDI的几个最佳实践
科普达人丨一文弄懂什么是云计算?
状态模式 - Unity(有限状态机)
QT中自定义控件的创建到封装到工具栏过程(一):自定义控件的创建
PLC: automatically correct the data set noise, wash the data set | ICLR 2021 spotlight
MRS离线数据分析:通过Flink作业处理OBS数据
随机推荐
A tour of grpc:03 - proto serialization / deserialization
From Devops to mlops: how do it tools evolve to AI tools?
LeetCode 1981. 最小化目标值与所选元素的差 每日一题
Number of exchanges in the 9th Blue Bridge Cup finals
LeetCode 1186. 删除一次得到子数组最大和 每日一题
Solidity函数学习
Sator推出Web3游戏“Satorspace” ,并上线Huobi
[Fantan] how to design a test platform?
Flask搭建api服务-生成API文档
LeetCode刷题day49
With the latest Alibaba P7 technology system, mom doesn't have to worry about me looking for a job anymore
Skimage learning (3) -- adapt the gray filter to RGB images, separate colors by immunohistochemical staining, and filter the maximum value of the region
First in China! Todesk integrates RTC technology into remote desktop, with clearer image quality and smoother operation
Flash build API service
专精特新软件开发类企业实力指数发布,麒麟信安荣誉登榜
Establishment of solid development environment
NeRF:DeepFake的最终替代者?
[Seaborn] combination chart: facetgrid, jointgrid, pairgrid
邮件服务器被列入黑名单,如何快速解封?
LeetCode 1155. 掷骰子的N种方法 每日一题