【SpringBoot】如何使用策略模式+抽象工厂+反射

简介: 【SpringBoot】如何使用策略模式+抽象工厂+反射

最近用了策略模式+抽象工厂+反射写了一个计算器的Demo,本来写好了加法和减法,通过设计模式实现了不修改代码,通过增加新类和修改配置文件就可以增加乘法和除法,符合开闭原则

分析

什么是反射

要想明白什么是反射,首先你要明白什么是正射,直接把类实例化就是正射

比如:

Person person=new Person();//这就是正射

反射则是运行是才知道创建的是哪个类,并且可以获取这个类的属性和方法

//获取配置文件的类名
 count count=new count();
 in = count.getClass().getResourceAsStream("/application.properties");
//通过工厂创建类
Strategy strategy= (Strategy) Class.forName("com."+countType).newInstance();

这样就实现了运行时才知道创建了哪些类,当你输入称号时,系统会自动匹配乘法需要创建哪个类,然后去工厂创建它,就可以使用了

原代码

package com;
import com.Context;
import com.count;
public class whichCaculate {

    public static int switchMethods(int num1, String Num ,int num2){

        count cou=new count();
        int result=0;// 计算结果
        switch(Num){
            case "+":
                Context context=new Context(new add());
                result=context.executeStrategy(num1,num2);
                break;
            case "-":
                context=new Context(new sub());
                result=context.executeStrategy(num1,num2);
                break;
        }
        return result;
    }
}

可以看出,原来是由计算类来控制是加法还是减法,一旦增加乘法,就需要去修改计算类,这样就违背了开闭原则。

代码

加法类 add.java

package com;

public class add implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

减法类 add.java

package com;

public class sub implements Strategy {
    @Override
    public int doOperation(int num1,int num2){
        return  num1-num2;
    }
}


抽象工厂 countFactory.java

package com;

public class countFactory {
    public Strategy getcount(String countType) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Strategy strategy= (Strategy) Class.forName("com."+countType).newInstance();
        return strategy;
    }
}

Context类

package com;

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy=strategy;
    }

    public int executeStrategy(int num1,int num2){
        return strategy.doOperation(num1,num2);
    }
}

Strategy 接口

package com;

public interface Strategy {
    public int doOperation(int num1, int num2);
}

主函数

package com;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Scanner;


public class count {


    private static int firstNum;
    private static String operate;
    private static int secondNum;

    public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException {

        Scanner sc=new Scanner(System.in);//实例化提取类
        System.out.println("请输入数字");
        firstNum=Integer.parseInt(sc.nextLine());//接收键盘输入
        System.out.println("请输入运算符");
        operate=sc.nextLine();
        System.out.println("请输入数字");
        secondNum=Integer.parseInt(sc.nextLine());

        count count=new count();
        InputStream in = null;
        Properties props = new Properties();
        //第一种方法,取得src下的属性文件,成功
        in = count.getClass().getResourceAsStream("/application.properties");
        props.load(in);
        //输出属性文件中的信息
        String key =operate;
        String value=props.getProperty(key);
        countFactory countfa=new countFactory();
        Context context =new Context(countfa.getcount(value));
        int sum=context.executeStrategy(firstNum,secondNum);
        System.out.println(sum);

    }


}
配置文件

```java
+=add
-=sub

增加乘法

首先创建乘法类multiplication.java

package com;

public class multiplication implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}

然后增加配置文件

+=add
-=sub
*=multiplication

然后就可以计算乘法了

目录
相关文章
|
设计模式 算法 Java
Springboot 使用设计模式- 策略模式
Springboot 使用设计模式- 策略模式
984 0
Springboot 使用设计模式- 策略模式
|
3月前
|
设计模式 算法 Java
Spring Boot 项目怎么使用策略模式?
策略模式是一种设计模式,它允许在运行时选择不同的算法或行为。此模式通过定义一系列算法并将它们封装在独立的类中实现,这些类可以互相替换。这样可以根据不同情况动态选择最适合的算法。 在Spring框架中,可以通过依赖注入来实现策略模式。首先定义一个抽象策略类(接口或抽象类),然后创建具体策略类实现不同的算法。具体策略类通过`@Service`注解并在名称中指定特定的策略(如加法、减法等)。在上下文类(如Service类)中,通过`@Resource`注入策略对象的Map集合,根据需要选择并执行相应的策略。
|
Java Spring
Spring Boot使用策略模式指定Service实现类
Spring Boot使用策略模式指定Service实现类
171 0
|
6月前
|
设计模式 算法 Java
谈谈springboot的策略模式
【4月更文挑战第14天】Spring Boot 中的策略模式主要通过接口和多个实现类来实现,这种设计允许在运行时动态选择算法或行为的具体实现。这是一种非常灵活的设计模式,可以帮助解耦组件之间的关系,使得系统更加灵活并易于扩展和维护。
98 2
springboot工厂模式+策略模式消除if-else
springboot工厂模式+策略模式消除if-else
133 0
|
JSON Java 数据格式
springboot 接口返回json中null转换成空数组或空字符串(递归+反射实现)
本来想加一个Jackson的配置类修改ObjectMapper实现把null转空字符串或空数组,但是加上之后发现没效果,找不到问题在哪里,不知道是不是我使用@RestControllerAdvice全局返回处理类的问题,所以就自己写了一个工具类方法处理,就在全局返回处理类里面调用
|
设计模式 算法 Java
利用springboot初始化机制三种实现策略模式的应用
面试时总被问,spring中使用了哪些设计模式,你在实际开发中又使用哪些设计模式。给他手指一个方向跟他说,这就是一个模式:go out!。
542 0
|
设计模式 算法 安全
SpringBoot下的策略模式,消灭了大量的ifelse,真香!
SpringBoot下的策略模式,消灭了大量的ifelse,真香!
329 0
SpringBoot下的策略模式,消灭了大量的ifelse,真香!
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
148 1
|
20天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62