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

文章目录

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

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

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

策略模式的奥秘

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

策略模式有什么利与弊?

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

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

策略模式涉及角色

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

策略模式步骤

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

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

代码实现案例

typescript 复制代码
// 策略接口
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 设计模式之【模板方法模式】

相关推荐
weixin_4434785127 分钟前
Flutter第三方常用组件包之路由管理
前端·javascript·flutter
武藤一雄30 分钟前
C# 异步回调与等待机制
前端·microsoft·设计模式·微软·c#·.netcore
啥都不懂的小小白37 分钟前
前端CSS入门详解
前端·css
林恒smileZAZ1 小时前
前端大屏适配方案:rem、vw/vh、scale 到底选哪个?
开发语言·前端·css·css3
QQ5110082851 小时前
基于区块链的个人医疗咨询挂号信息系统vue
前端·vue.js·区块链
he___H2 小时前
Spring中的设计模式
java·spring·设计模式
程序员小寒3 小时前
JavaScript设计模式(八):命令模式实现与应用
前端·javascript·设计模式·ecmascript·命令模式
wgod3 小时前
new AbortController()
前端
UXbot3 小时前
UXbot 是什么?一句指令生成完整应用的 AI 工具
前端·ai·交互·个人开发·ai编程·原型模式·ux
棒棒的唐3 小时前
WSL2用npm安装的openclaw,无法正常使用openclaw gateway start启动服务的问题
前端·npm·gateway