《设计模式的运用》使用策略模式+工厂模式优化代码中的if else
使用策略模式优化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的更多相关文章
- 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse
<设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...
- Springboot中实现策略模式+工厂模式
策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式? 具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELS ...
- 设计模式之第2章-抽象工厂模式(Java实现)
设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...
- SpringBoot使用策略模式+工厂模式
为了防止大量的if...else...或switch case代码的出现,可以使用策略模式+工厂模式进行优化. 在我的项目当中,报表繁多,所以尝试了这种方式进行优化报表的架构.代码很简单,如下: Fa ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- 学习设计模式第二十七 - GoF之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
- C#设计模式(3):抽象工厂模式(Abstract Factory)(转载)
概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来 ...
- .NET设计模式(3):抽象工厂模式(Abstract Factory)(转)
概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来 ...
- .NET设计模式(3):抽象工厂模式(Abstract Factory)
):抽象工厂模式(Abstract Factory) 抽象工厂模式(Abstract Factory) --探索设计模式系列之三 Terrylee,2005年12月12日 转载:http://terr ...
- 设计模式C++实现(1)——工厂模式
该文章转载自: http://blog.csdn.net/wuzhekai1985 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装 ...
随机推荐
- 天梯赛L1-027 出租
一.问题描述 下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index ...
- [Pytorch框架]3.2 MNIST数据集手写数字识别
文章目录 3.2 MNIST数据集手写数字识别 3.2.1 数据集介绍 3.2.2 手写数字识别 3.2 MNIST数据集手写数字识别 import torch import torch.nn as ...
- 「学习笔记」tarjan求最近公共祖先
Tarjan 算法是一种 离线算法,需要使用并查集记录某个结点的祖先结点. 并没有传说中的那么快. 过程 将询问都记录下来,将它们建成正向边和反向边. 在 dfs 的过程中,给走过的节点打上标记,同时 ...
- 云原生时代崛起的编程语言Go常用标准库实战
@ 目录 基础标准库 简述 字符串-string 底层结构 函数 长度 格式化输出 模版-template text/template html/template 正则表达式-regexp 编码-en ...
- ssh终端工具推荐-WindTerm
什么是WindTerm 官方github https://github.com/kingToolbox/WindTerm A Quicker and better SSH/Telnet/Serial/ ...
- 2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复 比如,arr = [4, 2, 0, 3, 1] 0 1 2 3 4 把0想象成洞
2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复 比如,arr = [4, 2, 0, 3, 1] 0 1 2 3 4 把0想象成洞,任何非0数字都可以来到这个洞里 ...
- 2022-07-16:以下go语言代码输出什么?A:[];B:[5];C:[5 0 0 0 0];D:[0 0 0 0 0]。 package main import ( “fmt“ )
2022-07-16:以下go语言代码输出什么?A:[]:B:[5]:C:[5 0 0 0 0]:D:[0 0 0 0 0]. package main import ( "fmt" ...
- Django4全栈进阶之路1 Django4下载与安装
python 下载安装: 下载网址:https://www.python.org/downloads/ 安装方法:https://www.cnblogs.com/beichengshiqiao/p/1 ...
- drf序列化器之反序列化的数据验证
模型层 from django.db import models # Create your models here. class Manufacturer(models.Model): ## 厂商 ...
- Vue 全局避免按钮重复点击
这里用到的 Vue.directive 自定义指令 自定义指令是对普通DOM元素进行的底层操作,它是一种有效的的补充和扩展,不仅可以用于定义任何的dom操作,并且是可以复用的 在 main.js 中写 ...