通过Java枚举实现策略模式,消除if/else块对项目维护的影响

问题: 给你n个无序的像m的整型数 ,在客户端选择一个排序算法(快速、归并、堆)去实现数组从小到大的排序。(0 <= n <= 5 * 104,-1 * 105 <= m <= 1 * 105

提示: 这里将省略之前排序文章中已有的代码:快速排序归并排序堆排序

提示: 注意看代码的注释

不使用策略模式

// 如果之后增加其他排序算法,要修改核心代码
// 为sortNames增加目标排序算法的名称
// 为目标排序算法增加if/else分支
public class Client {
    public static void main(String[] args) {
        int[] a = {12, -10, 30, 8, 93, 102,-506};
        final String[] sortNames = {"快速排序", "归并排序", "堆排序"};
        System.out.println("排序算法列表");
        for (int i = 0; i < sortNames.length; i++) {
            System.out.println(i + ". " + sortNames[i]);
        }
        Scanner in = new Scanner(System.in);
        System.out.print("请选择排序算法序号[0-" + (sortNames.length - 1) + "]: ");
        int x = in.nextInt();
        while (x < 0 || x >= sortNames.length) {
            System.out.print("请选择排序算法序号[0-" + (sortNames.length - 1) + "]: ");
            x = in.nextInt();
        }
        // 这里需要使用 if/else 判断用户选择了哪个排序算法
        if (x == 0) {
            System.out.println("快速排序,执行中...");
            HeadSort.sort(a);
            System.out.println("完成...");
        } else if (x == 1) {
            System.out.println("归并排序,执行中...");
            MergeSort.sort(a);
            System.out.println("完成...");
        } else {
            System.out.println("堆排序,执行中...");
            MergeSort.sort(a);
            System.out.println("完成...");
        }
        System.out.println("数组打印中...");
        System.out.println(Arrays.toString(a));
        System.out.println("完成...");
    }
}

策略模式: 根据用户提供的不同条件,做出不同的反应。对if/else块有着非常好的消除效果。
这里通过Java枚举实现策略模式,消除if/else块对项目维护的影响。

public interface Sort {
    void sort(int[] a);
}
public enum SortEnum implements Sort {
    /**
     *
     */
    QUICK_SORT("快速排序") {
        @Override
        public void sort(int[] a) {
            System.out.println("快速排序,执行中...");
            QuickSort.sort(a);
            System.out.println("完成...");
        }
    },
    MERGE_SORT("归并排序") {
        @Override
        public void sort(int[] a) {
            System.out.println("归并排序,执行中...");
            MergeSort.sort(a);
            System.out.println("完成...");
        }
    },
    HEAD_SORT("堆排序") {
        @Override
        public void sort(int[] a) {
            System.out.println("堆排序,执行中...");
            HeadSort.sort(a);
            System.out.println("完成...");
        }
    },
    NO_SELECT_SORT("没有选择排序类型") {
        @Override
        public void sort(int[] a) {
            System.out.println("请选择排序类型");
        }
    };
    private final String sortName;

    SortEnum(String sortName) {
        this.sortName = sortName;
    }

    public String getSortName() {
        return sortName;
    }
    
    public static SortEnum getConstantBySortName(String sortName) {
        SortEnum[] constants = SortEnum.values();
        for (int i = 0; i < constants.length - 1; i++) {
            if (constants[i].sortName.equals(sortName)) {
                return constants[i];
            }
        }
        return SortEnum.NO_SELECT_SORT;
    }
}
// 如果之后增加其他排序算法的话,不需要修改核心代码
// 只需要在SortEnum中增加一个代表目标排序算法的常量,实现Sort接口中的方法即可
public class Client {
    public static void main(String[] args) {
        int[] a = {12, -10, 30, 8, 93, 102,-506};
        SortEnum[] constants = SortEnum.values();
        int len = constants.length - 1;
        final String[] sortNames = new String[len];
        for (int i = 0; i < len; i++) {
            sortNames[i] = constants[i].getSortName();
        }
        Scanner in = new Scanner(System.in);
        System.out.print("请选择排序算法序号[0-" + (sortNames.length - 1) + "]: ");
        int x = in.nextInt();
        while (x < 0 || x >= sortNames.length) {
            System.out.print("请选择排序算法序号[0-" + (sortNames.length - 1) + "]: ");
            x = in.nextInt();
        }
        // 根据用户输入的序号,获取排序算法的名称sortName,
        // 之后根据sortName,获取不同排序算法对数组a进行从小到大的排序
        SortEnum.getConstantBySortName(sortNames[x]).sort(a);
        System.out.println("数组打印中...");
        System.out.println(Arrays.toString(a));
        System.out.println("完成...");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值