Java设计模式之策略模式

1. 策略模式介绍

1、根据它来避免 if-else 或 switch 分支判断,避免使用多重条件转移语句;

2、支持"开闭原则",可以在原有基础上选择行为方法,同时允许增加行为方法。

2. 策略模式结构类

① 接口或抽象类:自定义接口或抽象类,由多个实现类具体实现;

② 抽象方法:实现类中可以继承或重写它;

③ Bean实例:Spring提供注入ApplicationContext即应用上下文接口获取;通过不同BeanName(JDK提供的@Resource依赖注入原理)实现分支判断转移语句。

3.策略模式代码案例

一、首先定义枚举类,通过name绑定BeanName

java 复制代码
public enum ServicesNameEnum {

    CONSUMER_MEMBER("consumerMember", "consumerMemberService"),

    CONSUMER_USERINFOS("consumerUserInfos", "consumerUserInfosService");

    private final String name;

    private final String beanName;

    ServicesNameEnum(String name, String beanName) {
        this.name = name;
        this.beanName = beanName;
    }

    /**
     * 通过name获取IOC中对象实例
     *
     * @param name
     * @return
     */
    public static String getBeanNameByName(String name) {
        for (ServicesNameEnum servicesNameEnum : ServicesNameEnum.values()) {
            if (servicesNameEnum.getName().equals(name)) {
                return servicesNameEnum.getBeanName();
            }
        }
        return name;
    }

    public String getName() {
        return name;
    }

    public String getBeanName() {
        return beanName;
    }
}

二、定义接口

java 复制代码
public interface IConsumerService {
    List<UserInfo> findUserInfos(String authority);

    List<Order> findOrders(List<Long> orderIds);

    String insertMember(Member member) throws Exception;

    void insertUserInfo(UserInfo userInfo);

    void process(UserInfo userInfo);

}

三、第一个接口实现类

java 复制代码
@Service
public class ConsumerMemberService implements IConsumerService {

    @Override
    public List<UserInfo> findUserInfos(String authority) {
        System.out.println("ConsumerMemberService开始执行----------------------------");
        return null;
    }

    @Override
    public List<Order> findOrders(List<Long> orderIds) {
        System.out.println("ConsumerMemberService开始执行----------------------------");
        return null;
    }

    @Override
    public String insertMember(Member member) throws Exception {
        return null;
    }

    @Override
    public void insertUserInfo(UserInfo userInfo) {

    }

    @Override
    public void process(UserInfo userInfo) {

    }


}

四、第二个接口实现类

javascript 复制代码
@Service
public class ConsumerUserInfosService implements IConsumerService {

    @Override
    public List<UserInfo> findUserInfos(String authority) {
        System.out.println("ConsumerUserInfosService开始执行----------------------------");
        return null;
    }

    @Override
    public List<Order> findOrders(List<Long> orderIds) {
        System.out.println("ConsumerUserInfosService开始执行----------------------------");
        return null;
    }

    @Override
    public String insertMember(Member member) throws Exception {
        return null;
    }

    @Override
    public void insertUserInfo(UserInfo userInfo) {

    }

    @Override
    public void process(UserInfo userInfo) {

    }


}

五、依赖注入ApplicationContext容器对象,根据BeanName获取具体对象实例

java 复制代码
 	@Autowired
    private ApplicationContext applicationContext;

    @RequestMapping(value = "/getInstanceByBeanName",method = RequestMethod.GET)
    public void getInstanceByBeanName(String name) {
        // 获取name
        name = "consumerUserInfos";
        // name绑定BeanName
        String beanName = ServicesNameEnum.getBeanNameByName(name);
        // ApplicationContext即应用上下文通过BeanName获取具体对象实例(JDK提供的@Resource原理)
        // IConsumerService 为接口或抽象类并且多个实现类;最终实例对象由beanName决定
        IConsumerService iConsumerService= (IConsumerService) applicationContext.getBean(beanName);
        // 多态;最终调用实现类的重写方法
        iConsumerService.findUserInfos(null);
    }

六、控制台执行结果

javascript 复制代码
ConsumerUserInfosService开始执行----------------------------
相关推荐
蛋蛋的就会顺顺的4 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8264 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡4 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
伯恩bourne6 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_7 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs7 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲7 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户21296835261688 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail8 小时前
05 管理活动与选品
java