您当前的位置:首页 > 计算机 > 编程开发 > 设计模式

【设计模式】16.行为型模式-策略(Strategy)

时间:02-01来源:作者:点击数:

一、描述

  定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。

  1.角色

    (1)抽象类:定义算法方法。

    (2)具体实现类:继承抽象类,实现算法方法。

  2.类图

二、

以快速排序算法、合并排序算法为例,类图很简单,和上面的类图差不多,所以就不画了。直接上代码:

  1.抽象计算类

public interface Calculate {
    void order(int[] values);
}

  2.快速排序算法(想了解该算法的话参考文章:算法-快速排序)

public class FastSortCalculate implements Calculate {
    @Override
    public void order(int[] values) {
        int left = 0;
        int right = values.length - 1;
        sort(values, left, right);
        System.out.println("快速排序:"); for (int i = 0; i < values.length; i++) { System.out.print(" " + values[i]); } System.out.println(); } private void sort(int[] a, int left, int right) { if (left > right) { return; } int i = left; int j = right; int sign = a[left]; while (i != j) { //查找比sign小的元素位置 while (a[j] >= sign && i < j) { j--; } //查找比sign大的元素位置 while (a[i] <= sign && i < j) { i++; } //交换 if (i < j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } //相遇或者遇到(8)(10)(11)等情况,直接交换 a[left] = a[j]; a[j] = sign; //分割数组重新排序 sort(a, left, j - 1); sort(a, j + 1, right); } }

  3.合并排序算法(想了解该算法的话参考文章:算法-合并排序)

public class MergeSortCalculate implements Calculate {
    @Override
    public void order(int[] values) {
        //定义下标
        int right = values.length - 1;
        int left = 0;
        int[] b = new int[values.length]; mergeSort(values, b, left, right); //合并 System.out.println("合并排序:"); for (int i = 0; i < b.length; i++) { System.out.print(" " + b[i]); } System.out.println(); } public static void mergeSort(int[] a, int[] b, int left, int right) { if (left == right) { //分到最小单位 return; } if (left < right) { //当未拆分完时继续拆分 int mid = (left + right) / 2; //分组  mergeSort(a, b, left, mid); mergeSort(a, b, mid + 1, right); //拆分完合并 //i定义为左边数组起点 int i = left; //i定义为右边数组起点 int j = mid + 1; //新数组下标 int t = 0; //当前两边数组未排序完成时 while (i <= mid && j <= right) { //定义min接收较小数据 int min; if (a[i] < a[j]) { //若当前左边数组i位置上的数据小于右边数组j位置上的数据,说明右边数组j后面位置的数据都大于i对应的数据, // 所以i++向后移动比较下一个左边数组的数据与当前右边数据j的数据。 min = a[i]; i++; } else { //若左边数组i位置上的数据大于j位置上的数据,则i位置要继续与右边数组剩下的数据进行比较,j++ min = a[j]; j++; } //将较小数据放到b数组对应位置上,并且下标向后移动一位 b[t++] = min; } //若左边数组上还有剩余数据,则放到数组中 while (i <= mid) { b[t++] = a[i++]; } //若右边数组上还有剩余数据,则放到数组中 while (j <= right) { b[t++] = a[j++]; } //将b数组中的有序数组放到a对应的位置上。 t = 0; while (left <= right) { a[left++] = b[t++]; } } } }

  4.调用

public class Client {
    public static void main(String[] args) {
        int[] a = {9, 5, 2, 7, 12, 4, 3, 1, 11};
        Calculate fastSortCalculate = new FastSortCalculate();
        fastSortCalculate.order(a);

        Calculate mergeSortCalculate = new MergeSortCalculate(); mergeSortCalculate.order(a); } }

  5.效果

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门