Java策略模式

目录

前言

策略模式

参考文章

详细讲解

抽象实践类

实现不同策略

重点:业务容器

测试类


前言

工作前几年,个人觉得掌握相关的设计模式来简化工作很重要。

策略模式

根据不同的策略执行不同的业务逻辑

参考文章

这里 ,其实我们项目里面也有相关应用

基本思路都是,有个抽象的类,包括执行方法,然后一个type来设计不同的策略,一个map来保存不同策略对应不同执行方案,方案是实现抽象类的各种类

详细讲解

抽象实践类

public abstract class InspectionSolver {

    public abstract void doSomeThing(int i);

    public abstract String getType();

}

doSomeThing处理不同的业务逻辑

getType进行设置不同的type,或者像上面图一样每新增一个就得在init进行设置map

实现不同策略

@Component
public class AInspectionSolver extends InspectionSolver{
    @Override
    public void doSomeThing(int i) {
        System.out.println("A调用"+i);
    }

    @Override
    public String getType() {
        return "A";
    }
}

@Component
public class BInspectionSolver extends InspectionSolver{
    @Override
    public void doSomeThing(int i) {
        System.out.println("B调用"+i);
    }

    @Override
    public String getType() {
        return "B";
    }
}

重点:业务容器

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

/**
 * Created on 2019/9/2.
 *
 * @author yangsen
 */
@Component
public class InspectionSolverChooser implements ApplicationContextAware {

    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    private Map<String, InspectionSolver> chooseMap = new HashMap<>();

    public InspectionSolver choose(String type) {
        return chooseMap.get(type);
    }

    @PostConstruct
    public void register() {
        Map<String, InspectionSolver> solverMap = context.getBeansOfType(InspectionSolver.class);
        for (InspectionSolver solver : solverMap.values()) {
            chooseMap.put(solver.getType(), solver);
        }
    }

}

可以看到和图一样,采用@PostConstruct在类初始化前就行init,配置map

这里使用applicationContextAware获取ApplicationContext,调用context.getBeansOfType来获取所有某一类的所有bean,这样设计会更美观配置map

测试类

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    private InspectionSolverChooser chooser;

    @Test
    public void contextLoads() {

        //准备数据
        String taskType = "A";
        //获取任务类型对应的solver
        InspectionSolver solver = chooser.choose(taskType);
        if (solver == null) {
            throw new RuntimeException("任务类型暂时无法处理!");
        }
        //调用不同solver的方法进行处理
        solver.doSomeThing(100);

    }

}

获取不同策略下的抽象类,执行不同的业务

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在策略模式中,我们创建表示各种策略的对象和一个上下文对象,该对象可以根据其策略对象的不同行为而更改其执行算法。 以下是Java策略模式的示例代码: 首先,我们定义一个策略接口,该接口定义了一个方法calculate(),该方法将由具体策略类实现: ```java public interface Strategy { public int calculate(int num1, int num2); } ``` 然后,我们实现两个具体策略类,它们实现了策略接口并提供了自己的实现: ```java public class AddStrategy implements Strategy { public int calculate(int num1, int num2) { return num1 + num2; } } public class SubtractStrategy implements Strategy { public int calculate(int num1, int num2) { return num1 - num2; } } ``` 接下来,我们定义一个上下文类,该类将使用策略接口来执行算法: ```java public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int num1, int num2) { return strategy.calculate(num1, num2); } } ``` 最后,我们可以在客户端代码中使用上下文对象来执行算法: ```java public class Client { public static void main(String[] args) { Context context = new Context(new AddStrategy()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new SubtractStrategy()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); } } ``` 输出结果为: ``` 10 + 5 = 15 10 - 5 = 5 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值