策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使得它们之间可以互相替换。策略模式允许客户端在运行时选择所需的算法,而不必修改客户端代码或者使用复杂的条件语句。
策略模式通常由两部分组成:抽象策略类和具体策略类。抽象策略类定义了一个公共接口,用于封装具体算法的实现方式。具体策略类则实现了这个接口,并提供了自己的算法实现。
策略模式通过将算法的复杂性封装为统一的策略接口,抽象并封装了整个算法的实现方式。客户端可以调用策略接口来切换不同算法的实现,而不是直接调用算法的方法。如果各算法实现中包含大量相同或相似的条件判断逻辑,可以将这些逻辑抽象到策略接口中,各实现类只需实现算法独有的部分低维护成本。这种封装还使得算法的实现部分与客户端相互独立,客户端只需关注如何选择和使用不同的算法即可,提高了代码的可读性和可维护性。
示例代码
package cn.leetcode.strategy;
public interface ISort {
void sort();
}
package cn.leetcode.strategy;
public class SelectionSort implements ISort {
private int[] nums;
public SelectionSort(int[] nums) {
this.nums = nums;
}
@Override
public void sort() {
System.out.println("选择排序");
int len = nums.length;
for (int i = 0; i < len - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < len; j++) {
if (nums[j] < nums[minIndex]) {
minIndex = j;
}
}
swap(nums, i, minIndex);
}
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
package cn.leetcode.strategy;
public class InsertionSort implements ISort {
private int[] nums;
public InsertionSort(int[] nums) {
this.nums = nums;
}
@Override
public void sort() {
System.out.println("插入排序");
int len = nums.length;
// 把 nums[i] 插入有序数组 nums[0..i - 1]
for (int i = 1; i < len; i++) {
for (int j = i; j > 0; j--) {
// 注意:前面的数严格大于后面的数才交换
if (nums[j - 1] > nums[j]) {
swap(nums, j, j - 1);
} else {
break;
}
}
}
}
private void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}
package cn.leetcode.strategy;
public class StrategyContext {
private ISort strategy;
public StrategyContext(ISort strategy) {
this.strategy = strategy;
}
public void contextMethod() {
strategy.sort();
}
}
package cn.leetcode.strategy;
import java.util.Arrays;
public class Client {
public static void main(String[] args) {
int[] nums = new int[]{5, 4, 3, 2, 1};
// ISort strategy = new SelectionSort(nums);
ISort strategy = new InsertionSort(nums);
// 创建策略上下文
StrategyContext context = new StrategyContext(strategy);
context.contextMethod();
System.out.println(Arrays.toString(nums));
}
}
总结
策略模式是一种行为型设计模式,它允许在运行时动态选择算法的行为。这个模式通过将算法封装在独立的类中,使得它们 可以互相替换,从而使得系统更灵活、可扩展和易于维护。在策略模式中,客户端通过调用一个统一的接口来使用不同的算法,而不需要关心具体的实现细节。
阅读量:2017
点赞量:0
收藏量:0