当前位置:网站首页>策略模式 - 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等,代码更简洁。
- 满足开闭原则,在扩展新算法时,无需更改客户端代码。
- 将业务逻辑和算法实现分离
缺点
- 使系统更复杂
- 客户端本身需要明白不同策略算法之间的区别
与其他模式的区别
- 桥接 和 策略 十分相似,且都是将任务委托给引用对象,但本质却不同,桥接注重将功能分离,通过抽象化类对各个实现化引用进行交互,来完成对应功能,本质是将各个功能组合成一个大的结构,且思想主要是通过组合的方式来替代继承完成抽象和实现的分离。策略模式注重的只有一个,那就是算法在运行中可以相互切换,且互不干扰,算法的实现和业务逻辑分离。
- 模板方法 和 策略 都是对算法不同实现。但思路不同,模板方法本身是在一个算法骨架上,对特定步骤进行重写,算法本身是有顺序的。而策略的算法实现,则可以完全不同,只要完成了特定任务即可。模板方法是类继承,而策略是对象组合。模板方法算法是静态的,而策略算法是动态的。
- 状态 和 策略 都是运行时的功能切换。状态的功能切换,主要是状态改变使得功能的切换,策略则是主动切换。状态没有明确功能实现和状态切换的分离,可以和策略模式配合,实现实现和切换的分离。
边栏推荐
- How to implement safety practice in software development stage
- Process from creation to encapsulation of custom controls in QT to toolbar (I): creation of custom controls
- 鲲鹏开发者峰会2022 | 麒麟信安携手鲲鹏共筑计算产业新生态
- How to choose the appropriate automated testing tools?
- Shallow understanding Net core routing
- LeetCode 1155. N ways to roll dice one question per day
- QML beginner
- 第九届 蓝桥杯 决赛 交换次数
- LeetCode 1981. Minimize the difference between the target value and the selected element one question per day
- L1-028 判断素数(Lua)
猜你喜欢

【Seaborn】组合图表:FacetGrid、JointGrid、PairGrid

浅浅理解.net core的路由

Sator launched Web3 game "satorspace" and launched hoobi

Pycharm IDE下载

麒麟信安携异构融合云金融信创解决方案亮相第十五届湖南地区金融科技交流会

Linux 安装mysql8.X超详细图文教程
![[Seaborn] combination chart: facetgrid, jointgrid, pairgrid](/img/89/a7cf40fb3a7622cb78ea1b92ffd2fb.png)
[Seaborn] combination chart: facetgrid, jointgrid, pairgrid

《产品经理必读:五种经典的创新思维模型》的读后感

QT picture background color pixel processing method

skimage学习(3)——使灰度滤镜适应 RGB 图像、免疫组化染色分离颜色、过滤区域最大值
随机推荐
电脑无法加域,ping域名显示为公网IP,这是什么问题?怎么解决?
Reflections on "product managers must read: five classic innovative thinking models"
SlashData开发者工具榜首等你而定!!!
Flask搭建api服务-生成API文档
On Apache Doris Fe processing query SQL source code analysis
DNS series (I): why does the updated DNS record not take effect?
Test case management tool recommendation
MySQL implements the query of merging two fields into one field
Sator推出Web3遊戲“Satorspace” ,並上線Huobi
【图像传感器】相关双采样CDS
LeetCode 1155. N ways to roll dice one question per day
Problems encountered in Jenkins' release of H5 developed by uniapp
Pychart ide Download
鲲鹏开发者峰会2022 | 麒麟信安携手鲲鹏共筑计算产业新生态
Flash build API Service - generate API documents
[Seaborn] combination chart: facetgrid, jointgrid, pairgrid
How to implement safety practice in software development stage
【Seaborn】组合图表:PairPlot和JointPlot
99% 用户在 Power BI 云端报表常犯错误
Repair method of firewall system crash and file loss, material cost 0 yuan