首页 > 其他分享 >《设计模式的运用》使用策略模式+工厂模式优化代码中的if else

《设计模式的运用》使用策略模式+工厂模式优化代码中的if else

时间:2023-07-11 18:44:28浏览次数:36  
标签:obj 策略 模式 else Strategy new 设计模式 public

使用策略模式优化if else

有这样一段逻辑

function{
    for{
        if()
        if()
        if(
            if(
                
            )
        )
        ...
    }
}

公司有的祖传的代码,是一段规则校验,校验的越多,每一个请求都会进来校验,加上后来的开发人员也不注意,每次多加校验就多加一个if,只要命中就在if里面写逻辑,好一点的会抽到一个方法中,看起来稍好些,但是if越加越多,一个循环最终发展到了数千行,可读性越来越差,领导点名重构;

解决方案: 策略模式+工厂模式

工厂模式大家都很熟悉了,所以简单介绍一下策略模式

策略模式,顾名思义,组要是依靠策略来完成类的具体行为,所以,策略模式的核心就是编写不同的策略类,我们可以通过Java的接口编写抽象策略,用不同的实现类来完成策略,当然策略模式还需要一个上下文的类,用来选择策略;现实生活中也有很好的例子,例如支付方式,你可以选择微信支付,支付宝支付,银行卡支付等,
首先我们编写抽象策略

public interface Strategy {
    Boolean check(Object obj);
}

然后我们编写具体的实现

public class StrategyImpl01 implements Strategy{
   @Override
   public int check(Object obj) {
     // 实现具体的业务逻辑
     return "";
   }
}
public class StrategyImpl02 implements Strategy{}
public class StrategyImpl03 implements Strategy{}
...

实现上下文类

public class Context {
   private Strategy strategy;
 
   public Context(Strategy strategy){
      this.strategy = strategy;
   }
 
   public int executeStrategy(Object obj){
      return strategy.check(obj);
   }
}

调用策略类

 public static void main(String[] args) {
      Context context = new Context(new StrategyImpl01());    
      context.check(obj)
      context = new Context(new StrategyImpl02());      
      context.check(obj)
      context = new Context(new StrategyImpl03());    
      context.check(obj)
   }

到此,策略模式已经实现了,但是不是特别优雅,所以我们加上了工厂模式
编写策略工厂

public clss Factory{
 // 申明一个全局的map,key 为if中的条件,value为策略类
 private static final Map<String,Strategy> strategyMap = new HashMa<String,Strategy>();
 // 填充map
 static {
     strategyMap.put("aaa",new StrategyImpl01())
     strategyMap.put("bbb",new StrategyImpl02())
     strategyMap.put("bbb",new StrategyImpl03())
     ...
 }
 // 暴露一个获取map的方法
 public static Strategy getStrategy(String key){
     return strategyMap.get(key).check(obj)
 }

}

这样,我们只需要在用的时候

public static void main(String[] args){
     Factory.getStrategy(key);
}

看起来优雅多了

标签:obj,策略,模式,else,Strategy,new,设计模式,public
From: https://www.cnblogs.com/sharing-center-cl/p/17545640.html

相关文章

  • 适配器模式解决数据格式适配问题
    @RestController@RequestMapping("/ClientUserAssist/")publicclassClientUserAssistController{@AutowiredClientUserAssistMapperclientUserAssistMapper;/**子系统数据导入接口**/@Transactional(rollbackFor=Exception.class)@PostMa......
  • Docker网络模式和案例分享
    Docker提供了多种网络模式和功能,以便在容器间建立网络通信和连接外部网络1.默认网络模式(bridge):Docker默认使用bridge网络模式,创建一个名为docker0的虚拟网桥,并为每个容器分配一个IP地址。容器间可以通过IP地址相互通信2.主机模式(host):使用主机模式时,容器直接使用宿主机......
  • ZeroMQ: Java 请求/响应和发布/订阅模式的简单实现
    转载于:https://blog.csdn.net/weixin_47951400/article/details/119142454 文章目录POM一、请求响应模式(ZMQ_REQ+ZMQ_REP)1.REP2.REQ3.测试REPREQ测试结果二、发布/订阅模式(ZMQ_PUB+ZMQ_SUB)1.PUB2.SUB3.测试PUBSUB测试结果 POM ......
  • 数维图智慧养老院三维可视化系统 开启精准养老模式
    前言我国已经迈入老龄化社会,老龄化社会中养老已然成为社会普遍关注的焦点,智慧养老成为未来趋势。建设背景社会因素养老床位数量也增长至2020年的821万张.每千名老人拥有养老床位增长至35张,相对于先进国家的50-7O张仍有较大差距。目前养老床位供需还处于紧张状态。“十四五”......
  • 重温设计模式 --- 组合模式
    引言组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,因为它们都具有相同的接口。组合模式由三个要素组成:抽象组件(Component):它定义了叶子节点和组合节点的公共接口,可以为叶子......
  • 重温设计模式 --- 桥接模式
    引言桥接模式是一种结构型设计模式,它可以将一个大类或一组相关的类拆分成抽象和实现两个独立的层次结构,从而可以在两个层次结构中分别变化。桥接模式的核心思想是“尽可能将抽象部分和实现部分分离,使它们可以独立地变化”。这样可以使得系统更加灵活,易于扩展和维护。在桥接模式......
  • 重温设计模式 --- 外观模式
    引言外观模式是一种结构型设计模式,它为客户端提供了一个简单的接口,使得客户端能够更容易地使用复杂的子系统。外观模式通过隐藏子系统的复杂性,简化了客户端的调用过程,同时也降低了客户端与子系统的耦合度。外观模式的核心思想是将系统的各个组件和子系统封装在一个单独的类中,称......
  • 重温设计模式 --- 代理模式
    引言代理模式是一种结构型设计模式,它允许您提供一个代理来控制对某个对象的访问。在某些情况下,直接访问对象可能会带来一些问题,比如安全问题、性能问题等。代理模式就是为了解决这些问题而设计的。在代理模式中,有三个核心角色:抽象主题(Subject)、真实主题(RealSubject)和代理(Pro......
  • Dubbo 我手写几行代码,就把通信模式给你解释清楚!
    作者:小傅哥博客:https://bugstack.cn原文:https://bugstack.cn/md/road-map/road-map.html沉淀、分享、成长,让自己和他人都能有所收获!......
  • 桥接模式(Bridge)
    一、代码示例#include<iostream>usingnamespacestd;////classComputer{//public://voidrun();//};////classHpWindows7:publicComputer{////};//classHpWindow8:publicComputer{////};////classHpWindowsX:publicComputer{////};......