策略模式解决if-else问题

这篇具有很好参考价值的文章主要介绍了策略模式解决if-else问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

释义:

策略模式是一种行为设计模式,它允许在运行时根据不同的情况来选择不同的策略。

这种模式支持开闭原则,在不修改现有代码的前提下,动态的添加、删除、替换算法。

组成部分:

策略接口(Strategy):它是一个接口,具体的策略实现类去实现这个接口,就可以提供不同的实现方式。

策略环境(Context):可以根据需要来修改策略,或者定义一个工厂类

策略实现类(ConcreteStrategy):以Strategy接口实现某具体算法

代码实现步骤:

1、定义Strategy接口(Strategy)

package com.example.strategy.service;


import com.example.strategy.entity.ResourcesEntity;

/**
 * 获取资源信息策略接口
 *
 */
public interface ResourcesStrategy {


    /*
    * 获取对应资源信息
    * 专家、队伍、装备
    * */
    ResourcesEntity getResourcesData(String type);


}

2、实体类、常量类定义(entity、constant)

//返回实体类
package com.example.strategy.entity;


import lombok.Data;

@Data
public class ResourcesEntity {

    private String name;
    private String lat;
    private String lng;

    private String resourcesType;

}

//常量类
package com.example.strategy.constant;

public class ResourcesConstant {
    public static final String EXPERT = "expert";
    public static final String EQUIP = "equip";
    public static final String MATERIALS = "materials";
    public static final String TEAM = "team";
}

3、具体的策略实现类(EquipStrategy、ExpertStrategy、TeamStrategy)

//装备策略实现类
package com.example.strategy;

import com.example.strategy.constant.ResourcesConstant;
import com.example.strategy.entity.ResourcesEntity;
import com.example.strategy.renum.ResourcesEnum;
import com.example.strategy.service.ResourcesStrategy;
import org.springframework.stereotype.Component;


@Component(ResourcesConstant.EQUIP)
public class EquipStrategy implements ResourcesStrategy {
    @Override
    public ResourcesEntity getResourcesData(String type) {
        ResourcesEntity resources = new ResourcesEntity();
        resources.setResourcesType(ResourcesEnum.EQUIP.id);
        resources.setName("装备");
        resources.setLng("");
        resources.setLat("");
        return resources;
    }
}

//专家策略实现类

package com.example.strategy;

import com.example.strategy.constant.ResourcesConstant;
import com.example.strategy.entity.ResourcesEntity;
import com.example.strategy.renum.ResourcesEnum;
import com.example.strategy.service.ResourcesStrategy;
import org.springframework.stereotype.Component;


@Component(ResourcesConstant.EXPERT)
public class ExpertStrategy implements ResourcesStrategy {
    @Override
    public ResourcesEntity getResourcesData(String type) {
        ResourcesEntity resources = new ResourcesEntity();
        resources.setResourcesType(ResourcesEnum.EXPERT.id);
        resources.setName("李安心专家");
        resources.setLng("");
        resources.setLat("");
        return resources;
    }
}


//队伍策略实现类
package com.example.strategy;

import com.example.strategy.constant.ResourcesConstant;
import com.example.strategy.entity.ResourcesEntity;
import com.example.strategy.renum.ResourcesEnum;
import com.example.strategy.service.ResourcesStrategy;
import org.springframework.stereotype.Component;


@Component(ResourcesConstant.TEAM)
public class TeamStrategy implements ResourcesStrategy {
    @Override
    public ResourcesEntity getResourcesData(String type) {
        ResourcesEntity resources = new ResourcesEntity();
        resources.setResourcesType(ResourcesEnum.TEAM.id);
        resources.setName("队伍1");
        resources.setLng("");
        resources.setLat("");
        return resources;
    }
}

4、策略环境(上下文)Context

package com.example.strategy.context;


import com.example.strategy.service.ResourcesStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class ResourcesStrategyContext {


    /*
    * 策略集合
    * 注入实例名和对应实例
    * */
    @Autowired
    private Map<String, ResourcesStrategy>  resourcesStrategyMap = new ConcurrentHashMap<>();


    /*
    * 初始化
    * */
    public ResourcesStrategyContext(Map<String, ResourcesStrategy> resourcesStrategyMap){
        //先进行清空处理
        this.resourcesStrategyMap.clear();
        //由于我们的具体策略实现业务类使用了@Component注解,所以会被spring自动扫描并且装配到容器中
        resourcesStrategyMap.forEach(this.resourcesStrategyMap::put);

    }

    public ResourcesStrategy getResourcesStrategy(String strategy){
        return  resourcesStrategyMap.get(strategy);
    }

}

5、功能验证

package com.example.strategy.controller;
import com.example.demo.util.StringUtils;
import com.example.strategy.context.ResourcesStrategyContext;
import com.example.strategy.entity.ResourcesEntity;
import com.example.strategy.renum.ResourcesEnum;
import com.example.strategy.service.ResourcesStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/resources")
public class ResourcesController {

    @Autowired
    ResourcesStrategyContext resourcesStrategyContext;

    @RequestMapping("/getResourcesData")
    public ResourcesEntity getResourcesData(String type){
        ResourcesStrategy resourcesStrategy = resourcesStrategyContext.getResourcesStrategy(type);
        ResourcesEntity resourcesData = resourcesStrategy.getResourcesData(type);
        return resourcesData;
    }
}

6、结果展示

策略模式解决if-else问题,设计模式,策略模式

7、策略模式和if-esle比较: 

1、易于拓展:不需要修改原有代码,方便的增加、删除算法。

2、提高代码可读性:不同的业务处理在不同的策略实现类中,易于理解和维护

3、避免大量的if-else语句

4、提高代码复用性文章来源地址https://www.toymoban.com/news/detail-780374.html

到了这里,关于策略模式解决if-else问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式:干掉if else的几种方法

    存在的问题: 如果业务逻辑过多 if else 可能要写多达几百行,这样代码可读性很差,不利于寻找bug和理解代码 如果if后面的判断逻辑过长,则代码可读性不强 如果将其写在一个核心代码里面,则新增功能时需要修改核心代码,要是不小心改到其他的代码就凉凉了 当业务逻辑

    2024年02月07日
    浏览(40)
  • 【状态模式】拯救if-else堆出来的屎山代码

    我想大家平时都在开发重都遇见过屎山代码,这些屎山代码一般都是由于复杂且庞大的if-else造成的,状态模式,是一种很好的优化屎山代码的设计模式,本文将采用两个业务场景的示例来讲解如何使用状态模式拯救屎山代码。 目录 前言 1.网购业务场景 1.1.需求 1.2.if else的实

    2024年02月12日
    浏览(40)
  • 设计模式第八讲:常见重构技巧 - 去除多余的if else

    最为常见的是代码中使用很多的if/else,或者switch/case;如何重构呢?方法特别多,本文是设计模式第八讲,带你学习其中的技巧。 通常业务代码会包含这样的逻辑:每种条件下会有不同的处理逻辑。比如两个数a和b之间可以通过不同的操作符(+,-,*,/)进行计算,初学者通

    2024年02月10日
    浏览(40)
  • Python if-else 速记

    编程中经常使用速记符号来简化我们的工作。 速记符号是一种可以更简洁、更省时省力地完成工作的方法。 本文将讨论 Python 中使用的速记符号作为 if-else 语句的快捷方式。 如前所述,速记符号是一种可以简洁地编写程序的方法。 到目前为止,我们在 Python 中使用了许多速

    2024年02月11日
    浏览(43)
  • springboot工厂模式解决if_else流程和问题点解决

    spring中的Bean由IOC容器进行管理,和普通工厂的区别就是springboot中的类不能通过自己New出来使用,如果通过new写入到工厂,涉及到相关实现类调用其他Service(该service在正确情况下正常注入),注入的Service也会报错异常Null,也就是工厂注入失败。 工厂中的相关Bean也通过Spring

    2023年04月09日
    浏览(65)
  • Python用if-else实现【猜数字】

    设置一个 范围1-100的随机整数变量 ,通过 while 循环,配合 input 语句,判断输入的数字是否等于随机数 无限次机会,直到猜中为止 每一次猜不中,会提示大了或小了 猜完数字后,提示猜了几次 提示: 无限次机会,终止条件不适合用数字累加来判断 可以考虑布尔类型本身 (

    2024年02月12日
    浏览(37)
  • 策略模式+Spring配置类优化多if..else思路

    场景: 假设设备上报不同类型的消息,我们要对不同类型的消息做不同的处理。如果我们通过if..else的方式处理的话会显得比较冗余。 例如: 那么对于不同消息的不同的处理逻辑我们可以单独放在一个实现类中,这些类有着相同的行为,所以我们可以定义一个接口: 针对于不

    2024年02月15日
    浏览(42)
  • mybatis使用xml中的if-else/choose

    最近需要使用 xml 文件来实现一些增删改查,此文对 其中的 if-else 加以说明 背景: 有一个引用类,假设叫 Student 现在我们查询条件也被封装成一个引用类,例如: 那么使用 xml 怎么来使用和接收呢? 首先肯定是在 mapper 里面有一个方法 然后在 xml 文件中写这个方法的具体实

    2024年04月23日
    浏览(37)
  • 不需要策略模式也能避免满屏if/else

    java 复制代码 public static void main(String[] args) { int a = 1; if(a == 1){ System.out.println(\\\"执行a=1的逻辑\\\"); }else if (a == 2){ System.out.println(\\\"执行a=2的逻辑\\\"); }else if (a == 3){ System.out.println(\\\"执行a=3的逻辑\\\"); }else if (a == 4){ System.out.println(\\\"执行a=4的逻辑\\\"); }else if (a == 5){ System.out.println(\\\"执行a=5的逻辑

    2024年02月06日
    浏览(88)
  • 条件运算符? : 与if-else语句的对比及用法详解

    条件运算符? : :给程序员提供了一种简便的方式进行条件判断和表达式的求值。在C语言中,条件运算符? : 是一个三元运算符,可以根据条件的真假来判断输出结果。本篇文章将详细介绍条件运算符的用法,以及与if-else语句的对比,并结合实例来进一步理解。 条件运算符?

    2024年02月05日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包