JavaScript 语言设计模式 策略模式的算法选择器

JavaScript阿木 发布于 2025-06-26 5 次阅读


摘要:

策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。本篇文章将围绕JavaScript语言,通过实现一个算法选择器,来探讨策略模式在JavaScript中的应用。

一、

在软件开发中,我们经常需要根据不同的条件或需求选择不同的算法。如果直接在代码中硬编码这些算法,会导致代码的耦合度高,可维护性差。策略模式通过将算法封装成独立的对象,使得算法之间可以灵活切换,从而提高代码的可读性和可维护性。

二、策略模式的基本概念

策略模式包含三个角色:

1. 策略(Strategy):定义了算法家族,分别封装起来,让它们之间可以互相替换。

2. 策略上下文(Context):维护一个策略对象,负责策略对象的创建和调用。

3. 客户端(Client):客户端根据具体需求选择合适的策略对象,并交给策略上下文。

三、算法选择器实现

以下是一个简单的JavaScript算法选择器的实现,我们将实现一个排序算法选择器,包括冒泡排序、选择排序和插入排序。

javascript

// 策略接口


var SortStrategy = function() {};

SortStrategy.prototype.sort = function(array) {


throw new Error('未实现 sort 方法');


};

// 冒泡排序策略


var BubbleSortStrategy = function() {


SortStrategy.call(this);


};

BubbleSortStrategy.prototype = new SortStrategy();

BubbleSortStrategy.prototype.sort = function(array) {


var len = array.length;


for (var i = 0; i < len; i++) {


for (var j = 0; j < len - 1 - i; j++) {


if (array[j] > array[j + 1]) {


var temp = array[j];


array[j] = array[j + 1];


array[j + 1] = temp;


}


}


}


return array;


};

// 选择排序策略


var SelectionSortStrategy = function() {


SortStrategy.call(this);


};

SelectionSortStrategy.prototype = new SortStrategy();

SelectionSortStrategy.prototype.sort = function(array) {


var len = array.length;


for (var i = 0; i < len - 1; i++) {


var minIndex = i;


for (var j = i + 1; j < len; j++) {


if (array[j] < array[minIndex]) {


minIndex = j;


}


}


if (minIndex !== i) {


var temp = array[i];


array[i] = array[minIndex];


array[minIndex] = temp;


}


}


return array;


};

// 插入排序策略


var InsertionSortStrategy = function() {


SortStrategy.call(this);


};

InsertionSortStrategy.prototype = new SortStrategy();

InsertionSortStrategy.prototype.sort = function(array) {


var len = array.length;


for (var i = 1; i < len; i++) {


var key = array[i];


var j = i - 1;


while (j >= 0 && array[j] > key) {


array[j + 1] = array[j];


j--;


}


array[j + 1] = key;


}


return array;


};

// 策略上下文


var SortContext = function(strategy) {


this.strategy = strategy;


};

SortContext.prototype.setStrategy = function(strategy) {


this.strategy = strategy;


};

SortContext.prototype.sort = function(array) {


return this.strategy.sort(array);


};

// 客户端


var sortContext = new SortContext(new BubbleSortStrategy());


var array = [5, 3, 8, 4, 1];


console.log('排序前:', array);


console.log('排序后:', sortContext.sort(array));

// 切换策略


sortContext.setStrategy(new SelectionSortStrategy());


console.log('排序后:', sortContext.sort(array));


四、策略模式的应用场景

1. 算法选择:如上例中的排序算法选择器,可以根据不同的需求选择不同的排序算法。

2. 数据处理:在数据处理过程中,根据数据类型或数据结构选择不同的处理策略。

3. 网络请求:根据不同的网络请求类型(如GET、POST、PUT等)选择不同的处理策略。

五、总结

策略模式在JavaScript中的应用非常广泛,通过将算法封装成独立的对象,可以使得算法之间可以互相替换,从而提高代码的可读性和可维护性。在实际开发中,我们可以根据具体需求设计不同的策略,并通过策略上下文来管理这些策略,实现灵活的算法选择。