Java 策略模式 if-else用法实例详解

下面是关于“Java 策略模式 if-else用法实例详解”的完整攻略。

什么是策略模式?

策略模式是一种行为型设计模式,该模式定义了一些算法,封装每个算法,并使它们可以相互替换。此模式使算法独立于使用它的客户端,并且可以更改算法的独立变化。

关于题目

本文讲解了一种在java程序中使用if-else来实现策略模式的方法。

如何使用if-else实现策略模式?

假设我们有一个计算器程序,其可以执行加,减,乘,除四种操作。我们可以使用策略模式将其实现。示例如下:

定义策略

首先我们定义一个策略接口,该接口里包含一个calculate方法,用于根据输入的参数进行计算。

public interface CalculateStrategy {
    int calculate(int a, int b);
}

实现策略

然后我们实现具体的策略类,包含加、减、乘、除四种操作的具体实现。

public class AddStrategy implements CalculateStrategy {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
}

public class SubtractStrategy implements CalculateStrategy {
    @Override
    public int calculate(int a, int b) {
        return a - b;
    }
}

public class MultiplyStrategy implements CalculateStrategy {
    @Override
    public int calculate(int a, int b) {
        return a * b;
    }
}

public class DivideStrategy implements CalculateStrategy {
    @Override
    public int calculate(int a, int b) {
        return a / b;
    }
}

调用策略

接下来我们定义一个Calculator类,用于执行具体的计算操作。

public class Calculator {
    public static int execute(int a, int b, String operator) {
        CalculateStrategy strategy = null;

        if (operator.equals("+")) {
            strategy = new AddStrategy();
        } else if (operator.equals("-")) {
            strategy = new SubtractStrategy();
        } else if (operator.equals("*")) {
            strategy = new MultiplyStrategy();
        } else if (operator.equals("/")) {
            strategy = new DivideStrategy();
        }

        if (strategy == null) {
            throw new IllegalArgumentException("Invalid Operator!");
        }

        return strategy.calculate(a, b);
    }
}

在Calculator类中,我们根据传入的operator参数判断是哪个具体的策略类实现并执行对应的calculate方法。

这里的operator永远都是可控的,但是如果出现了未知的情况,那么就需要抛出异常,提醒异常的处理。

测试代码

最后我们可编写一个测试类,测试Calculator类的执行结果。

public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 2;

        System.out.println("a + b = " + Calculator.execute(a, b, "+"));
        System.out.println("a - b = " + Calculator.execute(a, b, "-"));
        System.out.println("a * b = " + Calculator.execute(a, b, "*"));
        System.out.println("a / b = " + Calculator.execute(a, b, "/"));
    }
}

示例1:使用if-else实现策略模式

下面是示例1的完整代码:

public interface CalculateStrategy {
    int calculate(int a, int b);
}

public class AddStrategy implements CalculateStrategy {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
}

public class SubtractStrategy implements CalculateStrategy {
    @Override
    public int calculate(int a, int b) {
        return a - b;
    }
}

public class MultiplyStrategy implements CalculateStrategy {
    @Override
    public int calculate(int a, int b) {
        return a * b;
    }
}

public class DivideStrategy implements CalculateStrategy {
    @Override
    public int calculate(int a, int b) {
        return a / b;
    }
}

public class Calculator {
    public static int execute(int a, int b, String operator) {
        CalculateStrategy strategy = null;

        if (operator.equals("+")) {
            strategy = new AddStrategy();
        } else if (operator.equals("-")) {
            strategy = new SubtractStrategy();
        } else if (operator.equals("*")) {
            strategy = new MultiplyStrategy();
        } else if (operator.equals("/")) {
            strategy = new DivideStrategy();
        }

        if (strategy == null) {
            throw new IllegalArgumentException("Invalid Operator!");
        }

        return strategy.calculate(a, b);
    }
}

public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 2;

        System.out.println("a + b = " + Calculator.execute(a, b, "+"));
        System.out.println("a - b = " + Calculator.execute(a, b, "-"));
        System.out.println("a * b = " + Calculator.execute(a, b, "*"));
        System.out.println("a / b = " + Calculator.execute(a, b, "/"));
    }
}

示例2:使用if-else实现多条件判断

在实际开发中我们可能会遇到多个条件的判断,我们可以使用if-else来优化代码实现方式,示例如下:

public class Command {
    public void execute(String command) {
        if (command.equals("start")) {
            // 启动操作
        } else if (command.equals("stop")) {
            // 停止操作
        } else if (command.equals("restart")) {
            // 重启操作
        } else {
            throw new IllegalArgumentException("Invalid Command: " + command);
        }
    }
}

在这个例子中,我们可以看到对于每一个command的执行,我们都使用了if-else进行判断和实现。但是,我们不推荐这种方法,因为如果当我们需要新增的功能,就需要再对代码进行修改。

可以建立子类继承一个父类,或者实现一个接口,而不是使用上述方式。这样我们就可以避免出现if-else开发模式。

总结

if-else实现策略模式虽然简单,但是会造成代码中继续的可维护性较差,以及可读性较差的情况。我们建议最好使用一个抽象基类或接口,然后在不同的子类中去实现。这样,我们就可以在代码中取消掉“if-else行为”,从而使代码更加具有可维护性,还可以通过多态的方式降低代码的耦合性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 策略模式 if-else用法实例详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Mybatis传递多个参数的解决办法(三种)

    我会为您详细讲解Mybatis传递多个参数的解决办法。 Mybatis传递多个参数的解决办法有以下三种: 1. 通过Map传递多个参数 这种传递多个参数的方式比较简单,我们只需要将需要传递的多个参数封装到一个Map中,然后将Map作为参数传递即可。 示例代码: public interface UserMapper { List<User> ge…

    Java 2023年5月20日
    00
  • Mybatis-Plus接口BaseMapper与Services使用详解

    关于“Mybatis-Plus接口BaseMapper与Services使用详解”的攻略,我来详细讲解一下。 一、前言 Mybatis-Plus是Mybatis的一个增强工具,可以帮助我们快速地开发数据库应用程序。Mybatis-Plus提供了BaseMapper和BaseService两个接口,可以非常方便地进行数据操作。接下来我将对这两个接口进行详细的讲…

    Java 2023年5月20日
    00
  • Java字符串拼接的五种方法及性能比较分析(从执行100次到90万次)

    这里给您讲解一下“Java字符串拼接的五种方法及性能比较分析(从执行100次到90万次)”的完整攻略。 标题 Java字符串拼接的五种方法及性能比较分析(从执行100次到90万次) 内容 前言 随着Java开发的广泛应用,字符串拼接也成为了Java开发中不可避免的一个问题。在这篇文章中,我们将介绍Java中五种常见的字符串拼接方法,包括基本字符串拼接、Str…

    Java 2023年5月26日
    00
  • Java反射之通过反射获取一个对象的方法信息(实例代码)

    使用Java反射可以在运行时获取一个类的各种信息,包括类的属性、方法、构造器等。本文将介绍如何通过反射获取一个对象的方法信息,并提供两个示例进行说明。 获取对象的方法信息 要获取一个对象的方法信息,需要使用Java反射中的Method类。Method类提供了关于类或接口中单独某个方法的信息和访问权限。 使用反射获取对象的方法信息的步骤如下: 获取该类的Cla…

    Java 2023年5月26日
    00
  • 深入理解Java定时调度(Timer)机制

    深入理解Java定时调度(Timer)机制 什么是Java定时调度(Timer)机制? Java定时调度(Timer)机制是Java中的一个工具类,常用于在指定时间后运行代码或以固定间隔时间重复执行代码。 它通过创建一个线程来实现定时调度功能,其中的schedule()和scheduleAtFixedRate()方法提供了不同的时间调度方式。 schedul…

    Java 2023年5月20日
    00
  • java获取优酷视频地址示例

    获取优酷视频地址的过程,可以通过分析网页代码,找到视频的真实地址。以下是获取优酷视频地址的示例。 方法一:使用第三方库 可以使用第三方库,比如说YouGet,它可以直接获取到优酷视频的真实地址。具体操作如下: 安装YouGet pip install you-get 获取视频地址 you-get https://v.youku.com/v_show/id_X…

    Java 2023年5月26日
    00
  • jsp 文件下载示例代码

    下面是关于 JSP 文件下载示例代码的完整攻略: 一、准备工作 在编写 JSP 文件下载示例之前,我们需要准备以下工作: 创建一个 download.jsp 页面,用于处理文件下载请求并返回文件内容; 确定要下载的文件路径,并将该路径作为参数传递给 download.jsp 页面。 二、JSP 文件下载示例代码 以下是一个标准的 JSP 文件下载示例代码: …

    Java 2023年6月15日
    00
  • Java实现在线考试系统与设计(学生功能)

    Java实现在线考试系统与设计(学生功能) 系统概述 在线考试系统是基于Web的应用系统,主要是为了方便学生进行在线考试。该系统可以实现学生在线测试、查看成绩等功能。此系统采用Java EE技术,使用SpringMVC框架作为基础框架,使用MyBatis作为ORM框架,使用MySQL数据库进行数据存储。 学生功能 系统设计的学生功能分为以下几个模块: 1. …

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部