策略模式
策略模式屬于行為模式,可以在運(yùn)行時(shí)不修改類(lèi)本身而通過(guò)變更內(nèi)部算法來(lái)處理類(lèi)的行為變更。這允許對(duì)象的可擴(kuò)展性和松耦合性。
經(jīng)典定義如下:
定義一系列封裝的算法,可以交換這些算法來(lái)執(zhí)行特定的行為。
用例
解壓軟件例如 WinZip,提供了不同的算法去處理 gip、gzip、tar、jar、7zip格式。
在運(yùn)行時(shí),客戶(hù)端選擇了要執(zhí)行的算法類(lèi)型。
Email 客戶(hù)端像 outlook 支持很多類(lèi)型的郵件類(lèi)型例如 HTML 類(lèi)型。允許客戶(hù)端選擇 email 格式。
策略模式是怎樣工作的?
策略模式是簡(jiǎn)單而流行的模式,經(jīng)常與狀態(tài)模式一起使用。
以下是創(chuàng)建策略設(shè)計(jì)模式的步驟:
- 1.為你的策略對(duì)象實(shí)現(xiàn)一個(gè)策略接口,這個(gè)接口定義了策略對(duì)象的行為。
- 2.實(shí)現(xiàn)具體的策略類(lèi)(實(shí)現(xiàn)了 定義了上述步驟的策略接口)
- 3.創(chuàng)建一個(gè)上下文類(lèi),并且維護(hù)策略對(duì)象的引用。創(chuàng)建getter、setter方法,允許訪問(wèn)策略對(duì)象。
策略模式示例
我們來(lái)看一個(gè)示例,演示多種不同的排序算法例如插入排序、選擇排序、歸并排序等。允許客戶(hù)端選擇他們喜歡的排序類(lèi)型。
類(lèi)圖如下:

策略模式類(lèi)圖
public interface SortingStrategy {
public void sort(int[] numbers);
}
#### SelectionSort.java
```java
public class SelectionSort implements SortingStrategy {
@Override
public void sort(int[] numbers) {
System.out.println("Selection Sort!");
int i, j, first, temp;
for (i = numbers.length - 1; i > 0; i--) {
first = 0;
for (j = 1; j <= i; j++) {
if (numbers[j] > numbers[first])
first = j;
}
temp = numbers[first];
numbers[first] = numbers[i];
numbers[i] = temp;
}
System.out.println(Arrays.toString(numbers));
}
}
InsertionSort.java
public class InsertionSort implements SortingStrategy {
@Override
public void sort(int[] numbers) {
System.out.println("Insertion Sort!");
for (int i = 1; i < numbers.length; i++) {
int temp = numbers[i];
int j;
for (j = i - 1; (j >= 0) && (numbers[j] > temp); j--) {
numbers[j + 1] = numbers[j];
}
numbers[j + 1] = temp;
}
System.out.println(Arrays.toString(numbers));
}
}
SortingContext.java
public class SortingContext {
private SortingStrategy strategy;
public void setSortingMethod(SortingStrategy strategy) {
this.strategy = strategy;
}
public SortingStrategy getStrategy() {
return strategy;
}
public void sortNumbers(int[] numbers){
strategy.sort(numbers);
}
}