策略模式(及案例)

策略模式

1.策略接口

定义一组算法或操作的通用接口,通常是一个抽象类或接口。该接口声明了策略类所必须实现的方法。

示例:

js 复制代码
class Strategy {
  doOperation() {}
}
2.具体策略

实现策略接口,提供具体的算法实现。每个具体策略类负责处理一种特定的情况或算法。它包含了实际的业务逻辑。

示例:

js 复制代码
class ConcreteStrategyA extends Strategy {
  doOperation() {
    // 具体的算法实现
  }
}

class ConcreteStrategyB extends Strategy {
  doOperation() {
    // 具体的算法实现
  }
}
3.上下文

维持一个对策略对象的引用,负责将客户端的请求委派给具体的策略。上下文通常会包含一个接口,使得客户端可以动态地切换策略。

示例:

js 复制代码
class Context {
  constructor(strategy) {
    this.strategy = strategy;
  }
  
  setStrategy(strategy) {
    this.strategy = strategy;
  }
  
  executeStrategy() {
    this.strategy.doOperation();
  }
}
分数等级的案例:

假设我们有一个评分系统,根据用户的得分将其分为不同的等级。我们可以使用策略模式来实现这个例子,根据用户得分的不同区间采用不同的评级策略。以下是一个简单的JavaScript实现:

js 复制代码
// 策略接口
class GradeStrategy {
  getGrade(score) {}
}

// 具体策略 - 优秀
class ExcellentGradeStrategy extends GradeStrategy {
  getGrade(score) {
    if (score >= 90 && score <= 100) {
      return '优秀';
    }
    return null; // 不在该策略范围内返回null
  }
}

// 具体策略 - 良好
class GoodGradeStrategy extends GradeStrategy {
  getGrade(score) {
    if (score >= 80 && score < 90) {
      return '良好';
    }
    return null;
  }
}

// 具体策略 - 及格
class PassGradeStrategy extends GradeStrategy {
  getGrade(score) {
    if (score >= 60 && score < 80) {
      return '及格';
    }
    return null;
  }
}

// 上下文
class ScoreContext {
  constructor() {
    this.strategies = [];
  }

  addStrategy(strategy) {
    this.strategies.push(strategy);
  }

  getGrade(score) {
    for (const strategy of this.strategies) {
      const grade = strategy.getGrade(score);
      if (grade) {
        return grade;
      }
    }
    return '不及格'; // 默认策略
  }
}

// 使用策略模式
const context = new ScoreContext();

const excellentStrategy = new ExcellentGradeStrategy();
const goodStrategy = new GoodGradeStrategy();
const passStrategy = new PassGradeStrategy();

context.addStrategy(excellentStrategy);
context.addStrategy(goodStrategy);
context.addStrategy(passStrategy);

console.log(context.getGrade(95)); // 输出: 优秀
console.log(context.getGrade(85)); // 输出: 良好
console.log(context.getGrade(70)); // 输出: 及格
console.log(context.getGrade(55)); // 输出: 不及格
相关推荐
钱栈up2 天前
从 macOS 切回 Windows,我用 5 个免费工具把 80% 操作习惯搬了回来
windows·macos·策略模式
kunicoding4 天前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
峥嵘life5 天前
Android16 开机后立即打开相机闪退问题分析与解决总结
android·开发语言·数码相机·策略模式
智慧城市20306 天前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
happy_baymax7 天前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式
遇码7 天前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
mmsx8 天前
Android 架构分层:MVVM 与 MVP 共存,网络层怎么切
android·策略模式·mvvm·mvp
博风8 天前
7、设计模式应用举例:策略模式:加密、解密文件
设计模式·策略模式
mmsx8 天前
Android 本地优先的三级语义理解降级链
android·数码相机·策略模式
早点睡觉好了8 天前
LangChain 源码入门 02:消息、ChatPromptTemplate 与 Chat Model 调用链
ai·langchain·策略模式