放肆青春的博客
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)

放肆青春

一个前端菜鸟的技术成长之路
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)
  • 技术汇总

    • 技术总结
    • 技术文章
  • 技术术语

  • 技术方案

    • 技术场景汇总
    • 技术方案

    • 前端方案

    • 三方平台

    • 图片方案

    • 文件方案

  • 技术点

  • 设计模式及原则

    • 设计模式
    • 创建型模式

    • 结构型模式

    • 行为型模式

      • 观察者模式
      • 策略模式
        • 概述
        • 结构
      • 迭代器模式
      • 备忘录模式
      • 状态模式
    • 设计原则
  • technology
放肆青春
2021-12-22

策略模式

# 策略模式

策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。

# 概述

  • 解决问题:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护,缺乏弹性(扩展性差),复用性差
  • 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为
  • 如何解决:将这些算法封装成一个一个的类,任意地替换
  • 核心代码:实现同一个接口
  • 应用实例:
    • 诸葛亮的锦囊妙计,每一个锦囊就是一个策略
  • 优点:
    • 算法可以自由切换
    • 避免使用多重条件判断
    • 扩展性良好
  • 缺点:
    • 策略类会增多
    • 所有策略类都需要对外暴露
  • 使用场景:
    • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
    • 一个系统需要动态地在几种算法中选择一种。
    • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

# 结构

策略模式包含如下角色:

  • Context(环境类):持有一个 Strategy 类的引用,用一个 ConcreteStrategy 对象来配置。
  • Strategy(抽象策略类):定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现,Context 使用这个接口来调用其 ConcreteStrategy 定义的算法。
  • ConcreteStrategy(具体策略类):以 Strategy 接口实现某具体算法。

策略模式的使用,可以避免过多的 if-else 判断,也可以替代简单逻辑的 switch:

const formatDemandItemType = (value) => {
  switch (value) {
    case 0:
      return "初级";
    case 1:
      return "中级";
    case 2:
      return "高级";
  }
};

const formateDemandItemType = (value) => {
  const enum = {
    0: "初级",
    1: "中级",
    2: "高级",
  };
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
更新时间: 12/22/2021, 6:20:36 PM
观察者模式
迭代器模式

← 观察者模式 迭代器模式→

最近更新
01
前端权限管理
02-24
02
vue2指令
02-24
03
vue2 hook
02-24
更多文章>
Theme by Vdoing | Copyright © 2019-2022 放肆青春
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式