策略模式
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)); // 输出: 不及格