用策略模式加工厂模式优化多重if-else或者switch代码

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

用策略模式加工厂模式优化多重if-else或者switch代码

情景:通过不同的出行方式和数量拿到不同的减碳量
代码从controller开始贴 是为了更贴近真实场景

原始代码
controller:

    /**
     *  获取减碳量
     * @param travelEnum  出行方式
     * @param number    出行数量
     * @return
     */
    @GetMapping("test2")
    public String getCarbonEmission2(@RequestParam("travelEnum")TravelEnum travelEnum,
                                    @RequestParam("number") Integer number){
        return greenTravelService.getCarbonEmission2(travelEnum,number);
    }

枚举类:
TravelEnum:

@Getter
@AllArgsConstructor
public enum TravelEnum {

    WALK(1,"步行","walkModeService"),
    RIDE(2,"骑行","rideModeService"),
    CAR(3,"开车","carModeService");

    private int type;
    private String message;
    private String beanName;  //默认注入对象名称 就是类名首字母小写

}

service:

 public String getCarbonEmission2(TravelEnum travelEnum, Integer number) {
        switch (travelEnum) {
            case WALK:
                log.info("通过一系列计算得出步行减碳为500g");
                return "通过一系列计算得出步行减碳为500g";
            case RIDE:
                log.info("通过一系列计算得出骑行减碳为350g");
                return "通过一系列计算得出骑行减碳为3500g";
            case CAR:
                log.info("通过一系列计算得出开车减碳为200g");
                return "通过一系列计算得出开车减碳为200g";
            default:
                return null;
        }
    }

改进:
controller:

    /**
     *  获取减碳量
     * @param travelEnum  出行方式
     * @param number    出行数量
     * @return
     */
    @GetMapping("test1")
    public String getCarbonEmission(@RequestParam("travelEnum")TravelEnum travelEnum,
                                    @RequestParam("number") Integer number){
        return greenTravelService.getCarbonEmission(travelEnum,number);
    }

swevice:

    
    @Autowired
    GreenTravelModeFactory greenTravelModeFactory;
    
	public String getCarbonEmission(TravelEnum travelEnum, Integer number) {
        //通过工厂拿到具体实现类的service
        GreenTravelModeService travelModeService = greenTravelModeFactory.getTravelMode(travelEnum);
        //调用具体实现类的方法
        return travelModeService.getCarbonEmission(travelEnum, number);
    }

其中 GreenTravelModeService 是一个接口:

public interface GreenTravelModeService {

    public String getCarbonEmission(TravelEnum travelEnum, Integer number);
}

GreenTravelModeService 有三个实现类,分别代表 三种不同出行方式获得减碳的具体实现逻辑

其中
WalkModeService 实现类:

@Component
@Slf4j
public class WalkModeService implements GreenTravelModeService{
    @Override
    public String getCarbonEmission(TravelEnum travelEnum, Integer number) {
        log.info("通过一系列计算得出步行减碳为500g");
        return "通过一系列计算得出步行减碳为500g";
    }

}

RideModeService 实现类:

@Component
@Slf4j
public class RideModeService implements GreenTravelModeService{
    @Override
    public String getCarbonEmission(TravelEnum travelEnum, Integer number) {
        log.info("通过一系列计算得出骑行减碳为350g");
        return "通过一系列计算得出骑行减碳为3500g";
    }
}

CarModeService 实现类:

@Component
@Slf4j
public class CarModeService implements GreenTravelModeService{
    @Override
    public String getCarbonEmission(TravelEnum travelEnum, Integer number) {
        log.info("通过一系列计算得出开车减碳为200g");
        return "通过一系列计算得出开车减碳为200g";
    }
}

上文中的: GreenTravelModeService travelModeService = greenTravelModeFactory.getTravelMode(travelEnum);
就是通过工厂拿到 真正执行这个 GreenTravelModeService 的实现类,怎末拿? 看下面代码。

GreenTravelModeFactory:

@Component
public class GreenTravelModeFactory {

    public GreenTravelModeService getTravelMode(TravelEnum travelEnum){
        //通过springContext上下文对象拿到容器中的service
        return SpringContextUtil.getBean(travelEnum.getBeanName(),GreenTravelModeService.class);
    }

}

通过自定义的 SpringContextUtil 拿到容器中的对象,因为前面三个实现类都已经注入到spring容器中(@Component),且注入的对象名称就是 类名将首字母小写

SpringContextUtil:

@Component
@Slf4j
public class SpringContextUtil implements ApplicationContextAware {

    @PostConstruct
    private void init(){
        System.out.println(applicationContext);
    }

    private static ApplicationContext applicationContext;

    public static<T> T getBean(String name,Class<T> classs){
        //通过容器中对象的name以及class类型拿到对象
        return applicationContext.getBean(name,classs);
    }


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

该类通过实现 ApplicationContextAware 从而拿到 applicationContext 从而 能够到容器中拿到对象,项目启动,
setApplicationContext 该方法就会执行。文章来源地址https://www.toymoban.com/news/detail-438085.html

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

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

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

相关文章

  • 设计模式之【策略模式】,去掉繁琐的if-else,实现算法的动态替换

    全网最全最细的【设计模式】总目录,收藏起来慢慢啃,看完不懂砍我 策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),它是将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。属于行为型模式。 策略模式使用

    2024年02月09日
    浏览(34)
  • 简单工厂模式VS策略模式

    今天复习设计模式,由于简单工厂模式和策略模式太像了,重新整理梳理一下 简单工厂模式MUL图: 策略模式UML图: 1、简单工厂模式中只管创建实例,具体怎么使用工厂实例由调用方决定,他只负责创建具体对象; 2、策略模式是将生成实例的使用策略放在策略类中配置后才

    2024年02月15日
    浏览(31)
  • 设计模式:策略模式和工厂模式混合使用

    有时单个设计模式并不能满足我们的业务需求,这个时候就要根据具体的业务来混合使用设计模式,其中策略模式和工厂模式是比较常用的一个组合。工厂模式可以管理具体策略的生命周期,策略模式可以丰满具体细节的逻辑。 在这个示例中,我们定义了一个策略接口和两个

    2024年02月07日
    浏览(28)
  • 设计模式-策略工厂

    在介绍策略工厂的实现前,我们要先了解spring中beanFactory: BeanFactory 作为IOC服务的提供者,通过XmlBeanFactory来得到实例 生产Bean的工厂,采用延迟初始化策略(只有在需要某个对象时,才进行初始化和依赖注入); 通常会用xml文件来注册并管理各个业务对象之间的依赖关系

    2024年02月11日
    浏览(28)
  • 【C++ 设计模式】策略模式与简单工厂模式的结合

    在软件设计中,常常会遇到需要根据不同情况选择不同算法或行为的情况。策略模式和简单工厂模式是两种常见的设计模式,它们分别解决了对象行为的抽象和对象创建的抽象问题。在某些情况下,将这两种模式结合起来可以更好地满足实际需求,提高代码的灵活性和可维护

    2024年03月16日
    浏览(40)
  • 在springboot项目中使用策略工厂模式

    2024年02月14日
    浏览(36)
  • python使用工厂模式和策略模式实现读文件、分析内容功能

    当涉及到在 Python 中创建类以及使用设计模式来实现读取文件和分析内容的功能时,我们可以考虑使用工厂模式和策略模式的结合。下面是一个简单的示例,演示如何通过创建类和使用设计模式来实现这一功能: 在上面的示例中,我们首先创建了一个 `AnalysisFactory` 类作为工厂

    2024年02月20日
    浏览(35)
  • Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

            在平时的开发中,涉及到设计模式的有两块内容,第一个是我们 平时使用的框架 (比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。         面试官一般比较关心的是你在开发过程中, 有没有使用过设计模式,或者你在简历上写了关于设计

    2024年02月10日
    浏览(41)
  • C++ 程序设计:四大模式(工厂+装饰+策略+观察者)

    \\\"工厂+装饰+策略+观察者\\\"是常见且常用的设计模式之一,但并不是指称\\\"四大模式\\\"的官方术语。 \\\" 四大模式 \\\"通常是指指令式面向对象编程中的四个基本概念: 封装 、 继承 、 多态 和 抽象 。这四个概念是面向对象编程的基石。 工厂模式( 例:工厂方法模式 )中,通常存在

    2024年02月17日
    浏览(33)
  • 使用工厂模式、策略模式、门面模式、单例模式、责任链模式、装饰者模式和访问者模式来实现红包雨

    红包雨是一种在移动应用程序中经常出现的营销活动,它可以在特定时间内向用户投放很多红包,来吸引用户参与活动。如何在程序中实现红包雨呢?下面将介绍如何使用设计模式来实现红包雨。 首先,使用工厂模式来创建不同类型的红包对象。在工厂模式中,我们定义一个

    2024年02月09日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包