当前位置: 首页 > article >正文

TypeScript 设计模式之【策略模式】

文章目录

  • 策略模式:灵活切换算法的导航系统
  • 策略模式的奥秘
    • 策略模式有什么利与弊?
    • 如何使用策略模式来优化你的系统
    • 代码实现案例
    • 策略模式的主要优点
    • 策略模式的主要缺点
    • 策略模式的适用场景
    • 总结

在这里插入图片描述

策略模式:灵活切换算法的导航系统

当你使用导航软件规划路线时,可以根据自己的需求选择不同的策略:最短路径、最快路径、避开高速公路等。这个看似简单的功能选择,实际上完美诠释了策略模式的精髓。

在软件开发中,我们经常遇到需要在运行时选择算法的情况。策略模式就像这个导航系统,它定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。这种模式让算法可以独立于使用它的客户而变化!

策略模式的奥秘

策略模式就像一个"算法超市",它将一组相关的算法家族封装成一系列策略类,使得它们可以相互替换。通过这种方式,你可以在不影响客户端的情况下,随时增加、删除或修改算法,使得系统更加灵活和可扩展。

策略模式有什么利与弊?

策略模式的优点是它定义了一系列可复用的算法和行为,消除了一些条件语句,可以提供相同行为的不同实现。它遵循了开闭原则,使得算法可以独立于客户端而变化。缺点是客户端必须知道所有的策略类,且可能会创建多余的策略类。

如何使用策略模式来优化你的系统

策略模式涉及角色

  • 上下文(Context): 维护一个对策略对象的引用,可以定义一个接口来让策略访问它的数据
  • 策略(Strategy): 定义所有支持的算法的公共接口
  • 具体策略(ConcreteStrategy): 实现了 Strategy 接口的具体算法

策略模式步骤

  1. 创建一个策略接口,定义所有支持的算法的公共方法
  2. 创建具体策略类,实现策略接口,定义具体的算法
  3. 创建上下文类,包含策略对象的引用
  4. 在上下文类中实现客户端接口,将具体行为委托给当前策略对象
  5. 客户端通过上下文类来选择和使用不同的策略

选择合适的策略模式,你就能轻松地管理和切换不同的算法,让系统变得更加灵活和可维护!

代码实现案例

// 策略接口
interface RouteStrategy {
  calculateRoute(start: string, end: string): string;
}

// 具体策略类 - 最短路径
class ShortestPathStrategy implements RouteStrategy {
  calculateRoute(start: string, end: string): string {
    return `计算从 ${start}${end} 的最短路径`;
  }
}

// 具体策略类 - 最快路径
class FastestPathStrategy implements RouteStrategy {
  calculateRoute(start: string, end: string): string {
    return `计算从 ${start}${end} 的最快路径`;
  }
}

// 具体策略类 - 避开高速公路
class AvoidHighwaysStrategy implements RouteStrategy {
  calculateRoute(start: string, end: string): string {
    return `计算从 ${start}${end} 的路径,避开高速公路`;
  }
}

// 上下文类 - 导航系统
class NavigationSystem {
  private strategy: RouteStrategy;

  constructor(strategy: RouteStrategy) {
    this.strategy = strategy;
  }

  setStrategy(strategy: RouteStrategy): void {
    this.strategy = strategy;
  }

  route(start: string, end: string): string {
    return this.strategy.calculateRoute(start, end);
  }
}

// 客户端代码
const nav = new NavigationSystem(new ShortestPathStrategy());
console.log(nav.route("北京", "上海"));

nav.setStrategy(new FastestPathStrategy());
console.log(nav.route("广州", "深圳"));

nav.setStrategy(new AvoidHighwaysStrategy());
console.log(nav.route("成都", "重庆"));

// 输出
// 计算从 北京 到 上海 的最短路径
// 计算从 广州 到 深圳 的最快路径
// 计算从 成都 到 重庆 的路径,避开高速公路

在这里插入图片描述

策略模式的主要优点

  1. 算法可以自由切换: 策略模式提供了管理相关的算法族的办法
  2. 避免使用多重条件转移语句: 如果不使用策略模式,在选择具体算法时就可能会使用多重条件转移语句
  3. 扩展性良好: 在不修改原有系统的基础上可以更换算法或增加新的算法
  4. 策略类之间可以自由切换: 由于策略类都实现同一个接口,使它们之间可以自由切换

策略模式的主要缺点

  1. 客户端必须知道所有的策略类: 客户端需要理解所有策略算法的区别,以便适时选择恰当的算法类
  2. 将造成产生很多策略类: 可能会增加系统的复杂度
  3. 会增加系统中类的数目: 每一个策略都是一个类,复用性较低

策略模式的适用场景

  1. 许多相关的类仅仅是行为有异: 这些行为可以提取出来作为独立的策略类
  2. 需要使用一个算法的不同变体: 例如,定义一些反映不同的空间/时间权衡的算法
  3. 算法使用客户端不应该知道的数据: 可以使用策略模式以避免暴露复杂的、与算法相关的数据结构
  4. 一个类定义了多种行为,这些行为在这个类的操作中以多个条件语句的形式出现

总结

策略模式是一种行为型设计模式,它定义了算法家族,分别封装起来,让它们之间可以互相替换。策略模式让算法的变化独立于使用算法的客户。这种模式提高了系统的灵活性和可扩展性,同时也提高了代码的可读性和可维护性。合理使用策略模式,可以让你的代码结构更加清晰,更易于理解和维护。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告: TypeScript 设计模式之【模板方法模式】


http://www.kler.cn/news/324169.html

相关文章:

  • PHP Session扩展默认session数据储存在哪里
  • 3. 轴指令(omron 机器自动化控制器)——>MC_MoveFeed
  • IDEA开发SpringBoot项目基础入门教程。包括Spring Boot简介、IDEA创建相关工程及工程结构介绍、书写配置文件、Bean对象管理等内容
  • 【教学类-18-04】20240508《蒙德里安“黑白格子画” 七款图案挑选》
  • [大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究
  • 基于VUE的在线手办交易平台购物网站前后端分离系统设计与实现
  • 在矩池云使用 Llama-3.2-11B-Vision 详细指南
  • vxe-table制作高亮刷新功能
  • C#源码安装ZedGraph组件,并且立即演示使用
  • 代码随想录训练营第46天|回文子序列
  • 高通Camx-内存池架构/ImageBuffer
  • Linux进程的学习(持续更新)
  • java后端传时间戳给前端的三种方式
  • 学习C语言(21)
  • videojs 播放mp4视频只有声音没有画面问题
  • k8s搭建一主三从的mysql8集群---无坑
  • 【深度学习】注意力机制与自注意力机制详解
  • Docker学习路线
  • 将 Java 对象自动转换为 XML 字符串
  • 电子数据交换EDI 835 的处理
  • Spring Boot 进阶- Spring Boot 自定义拦截器详解
  • 中药材识别
  • 前置机、跳板机、堡垒机:安全运维领域的“黄金三角”
  • stm32 FLASH闪存(读写内部FLASH读取芯片ID)
  • Mac下利用vscode配置latex
  • 记一次因视频编码无法在浏览器播放、编码视频报错问题
  • 软件测试学习路线图
  • 【有啥问啥】深度解析迁移学习(Transfer Learning)
  • C#算法(16)—获取上升沿和下降沿信号
  • windows10使用bat脚本安装前后端环境之redis注册服务