策略模式概述
- 策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为
- 该模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
策略模式应用
// 首先,定义策略接口或抽象类
interface Strategy {
execute(data: number[]): number;
}
// 创建各种具体的策略类,实现策略接口
class AdditionStrategy implements Strategy {
execute(data: number[]): number {
return data.reduce((a, b) => a + b, 0);
}
}
class MultiplicationStrategy implements Strategy {
execute(data: number[]): number {
return data.reduce((a, b) => a * b, 1);
}
}
class AverageStrategy implements Strategy {
execute(data: number[]): number {
return this.executeWithReduction(data, (sum, count) => sum / count);
}
private executeWithReduction(data: number[], reducer: (sum: number, count: number) => number): number {
const sum = data.reduce((a, b) => a + b, 0);
return reducer(sum, data.length);
}
}
// 定义上下文类,维护策略并执行策略方法
class Context {
private strategy: Strategy;
constructor(strategy: Strategy) {
this.strategy = strategy;
}
public setStrategy(strategy: Strategy): void {
this.strategy = strategy;
}
public executeStrategy(data: number[]): number {
return this.strategy.execute(data);
}
}
// 使用示例
function main() {
const numbers = [1, 2, 3, 4, 5];
const context = new Context(new AdditionStrategy());
console.log("Addition result:", context.executeStrategy(numbers)); // 输出:15
context.setStrategy(new MultiplicationStrategy());
console.log("Multiplication result:", context.executeStrategy(numbers)); // 输出:120
context.setStrategy(new AverageStrategy());
console.log("Average result:", context.executeStrategy(numbers)); // 输出:3
}
main();
- 在这个例子中:
Strategy是一个接口,定义了所有策略都需要实现的公共方法execute AdditionStrategy、MultiplicationStrategy和AverageStrategy是具体的策略类,它们都实现了Strategy接口Context类是使用策略的上下文,它持有一个策略对象,并提供了setStrategy方法用于切换策略,以及executeStrategy方法来执行当前策略- 在
main函数中,我们创建了Context对象并设置了不同的策略,然后调用executeStrategy方法执行策略,观察到结果随着策略的改变而改变,体现了策略模式的灵活性
策略模式优缺点
1 )优点
-
开闭原则:策略模式对扩展开放,对修改封闭。新的策略可以很容易地添加到系统中,而无需修改现有的代码
-
多重条件逻辑简化:如果不用策略模式,你可能会在多个条件语句中有许多不同的算法。策略模式把这些算法分离到各自的类中,使代码更易于理解和维护
-
客户端无需知道具体策略类:客户端只需要知道策略接口,无需关心具体的策略实现,降低了客户端与具体策略之间的耦合度
-
多态性:策略模式利用多态性来切换算法,提高了代码的灵活性和可扩展性
-
模块化:每个策略都是一个独立的模块,易于理解和测试
-
消除条件判断:通过将行为封装在策略类中,可以消除大量条件语句(如 if-else 或 switch-case),从而简化客户端代码
-
可配置性:策略模式使得用户可以根据需要在运行时选择合适的策略,提高了系统的灵活性
-
降低耦合:策略模式将算法和使用算法的上下文分开,减少了两者之间的耦合度
2 )缺点
-
客户端必须知道选择不同的策略(了解所有策略):客户端需要知道有哪些策略可供选择,并显式地选择策略。这可能会增加客户端的责任和复杂性
-
增加对象数目:由于策略模式将每个具体的算法都单独封装为一个策略类,因此会增加系统中对象的数目
-
策略间的通信复杂:如果策略间需要通信或共享数据,可能会导致额外的设计复杂性
-
策略切换开销:频繁地在不同策略间切换可能带来一定的性能开销,尤其是在策略对象比较大的时候
-
策略的选择逻辑:有时候策略的选择逻辑本身也可能变得复杂,尤其是当选择逻辑涉及到多个条件时,可能会退化为难以维护的条件分支代码
182



被折叠的 条评论
为什么被折叠?



