使用策略模式优化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);
}

看起来优雅多了

《设计模式的运用》使用策略模式+工厂模式优化代码中的if else的更多相关文章

  1. 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse

    <设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...

  2. Springboot中实现策略模式+工厂模式

    策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式? 具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELS ...

  3. 设计模式之第2章-抽象工厂模式(Java实现)

    设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...

  4. SpringBoot使用策略模式+工厂模式

    为了防止大量的if...else...或switch case代码的出现,可以使用策略模式+工厂模式进行优化. 在我的项目当中,报表繁多,所以尝试了这种方式进行优化报表的架构.代码很简单,如下: Fa ...

  5. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  6. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  7. C#设计模式(3):抽象工厂模式(Abstract Factory)(转载)

    概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来 ...

  8. .NET设计模式(3):抽象工厂模式(Abstract Factory)(转)

    概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来 ...

  9. .NET设计模式(3):抽象工厂模式(Abstract Factory)

    ):抽象工厂模式(Abstract Factory) 抽象工厂模式(Abstract Factory) --探索设计模式系列之三 Terrylee,2005年12月12日 转载:http://terr ...

  10. 设计模式C++实现(1)——工厂模式

    该文章转载自: http://blog.csdn.net/wuzhekai1985 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装 ...

随机推荐

  1. 升级:In-Place Upgrade升级MySQL5.6.26

    升级需谨慎,事前先备份 MySQL升级的实质是对数据字典的升级,数据字典有:sys.mysql.information_schema.performance_schema . MySQL升级的两种方式 ...

  2. 中国省市区--地区SQL表

    SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for rc_district -- ---- ...

  3. 你知道Vue响应式数据原理吗

    1. Vue2的响应式式原理主要是通过Object.defineProperty的方法里面的setter和getter方法的观察者模式来实现.也就是在组件的初始话阶段给每一个data属性都注册一个se ...

  4. Nginx的负载均衡策略

    Nginx的负载均衡策略 个人博客地址: https://note.raokun.top 拥抱ChatGPT,国内访问网站:https://www.playchat.top 共六种: 轮询.权重.ip ...

  5. 执行sql报lock wait timeout exceeded; try restarting transaction

    mysql查询时候报错: Lock wait timeout exceeded; try restarting transaction 译文:锁等待超时;试着重新启动事务 被锁了,需要解锁. 1.in ...

  6. 从源码深入理解读写锁(golang-RWMutex)

    环境:go 1.19.8 在读多写少的情况下,即使一段时间内没有写操作,大量并发的读访问也不得不在Mutex的保护下变成串行访问,这种情况下,使用Mutex,对性能影响比较大. 所以就要区分读写操作. ...

  7. ai问答:vue3+pinia+WebSocket 封装断线重连(实战)

    把socket实例 挂载到全局 为方便梳理,请忽略typescript # main.ts import {createApp} from 'vue' import App from './App.v ...

  8. Oracle 定时任务job实际应用

    目录 一.Oracle定时任务简介 二.dbms_job涉及到的知识点 三.初始化相关参数job_queue_processes 四.实际创建一个定时任务(一分钟执行一次),实现定时一分钟往表中插入数 ...

  9. stl------stack与queue

    stack与queue 一.stack 二.queue 例题:详见我的另一篇博文: 栈------表达式求值 http://www.cnblogs.com/Cloud-king/p/8453703.h ...

  10. 2021-04-26:整型数组arr长度为n(3 <= n <= 10^4),最初每个数字是<=200的正数且满足如下条件: 1. arr[0] <= arr[1]。2.arr[n-1] <= arr

    2021-04-26:整型数组arr长度为n(3 <= n <= 10^4),最初每个数字是<=200的正数且满足如下条件: 1. arr[0] <= arr[1].2.arr ...