10.策略模式(行为型)-灵析社区

菜鸟码转

十、 策略模式(行为型)

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使得它们之间可以互相替换。策略模式允许客户端在运行时选择所需的算法,而不必修改客户端代码或者使用复杂的条件语句。

策略模式通常由两部分组成:抽象策略类和具体策略类。抽象策略类定义了一个公共接口,用于封装具体算法的实现方式。具体策略类则实现了这个接口,并提供了自己的算法实现。

策略模式通过将算法的复杂性封装为统一的策略接口,抽象并封装了整个算法的实现方式。客户端可以调用策略接口来切换不同算法的实现,而不是直接调用算法的方法。如果各算法实现中包含大量相同或相似的条件判断逻辑,可以将这些逻辑抽象到策略接口中,各实现类只需实现算法独有的部分低维护成本。这种封装还使得算法的实现部分与客户端相互独立,客户端只需关注如何选择和使用不同的算法即可,提高了代码的可读性和可维护性。

示例代码

  • 抽象策略接口
package cn.leetcode.strategy;


public interface ISort {

    void sort();

}
  • 具体策略实现 1:
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;
    }

}
  • 具体策略实现 2:
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