使用场景

如果在代码中出现大量if判断,再执行一些比较复杂的业务操作,类似于以下情况。

    @Test
void test() {
String str = "A";
if (str.equals("A")) {
System.out.println("A的方法1");
} else if (str.equals("B")) {
System.out.println("B的方法1");
}
}

此时如果使用if的重复判断,则代码过于冗长。

解决方法

采用工厂模式,策略模式,模版方法设计模式

1、创建一个抽象类,实现InitializingBean接口,由if对应条件的子类来实现

/**
* 模版方法设计模式
*/
public abstract class FunService implements InitializingBean {
public void fun1() {
throw new UnsupportedOperationException();
} public void fun2() {
throw new UnsupportedOperationException();
}
}

2、子类实现


import com.example.demo.manage.FunFactory;
import com.example.demo.service.FunService;
import org.springframework.stereotype.Service; @Service
public class AService extends FunService { @Override
public void fun1() {
System.out.println("A的方法1");
} @Override
public void fun2() {
System.out.println("A的方法2");
} @Override
public void afterPropertiesSet() throws Exception {
FunFactory.register("A", this); }
}

InitializingBean接口

方法afterPropertiesSet 是在类中的属性被注入后,再执行,一般用于对不可注入的类变量进行定义。

3、定义工厂,和策略的map

/**
* 工厂模式 策略模式
*/
public class FunFactory {
private static Map<String, FunService> map = new HashMap<>(); public static FunService getService(String str) {
return map.get(str);
} public static void register(String str, FunService service) {
if (StringUtils.isEmpty(str) || Objects.isNull(service)) return;
map.put(str, service);
}
}

在所有实现类的afterPropertiesSet方法中,向工厂注册。

4、执行

    @Test
void contextLoads() {
String str = "A";
FunService service = FunFactory.getService(str);
service.fun1();
}

小节

改进后的代码符合开闭原则,即是对于新的条件,只需要添加一个javabean,而不需言重新修改代码。

git 地址

https://github.com/lexiaoyao1995/design_mode

设计模式(多个if的处理)的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. 行为驱动模型-Behave

    行为驱动开发英文名为Behave Driven Development,简称BDD,是一种敏捷开发方法,主要是从用户的需求出发强调系统行为.将此模型借鉴到自动化测试中称其为行为驱动测试模型,它是一种通 ...

  2. java_数组的定义与操作

    数组定义和访问 数组概念 数组概念: 数组就是存储多个数据的容器,数组的长度固定,多个数据的数据类型要一致. 数组的定义 方式一 数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度 ...

  3. 利用maven的MyBatis Generator 插件自动创建代码

    1.首先创建Maven工程 2.修改pom.xml文件代码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...

  4. C++游戏(大型PC端枪战游戏)服务器架构

    实习期间深入参与到某大型pc端枪战游戏的后端开发中,此游戏由著名游戏工作室编写,代码可读性极高,自由时间对游戏后台代码进行了深入研究,在满足自身工作需要的同时对游戏后台的架构也有了理解,记录在此,以便 ...

  5. 从一次外卖到对oauth2.0的思考

    别问oauth1.0哪去了,问就是不好讲. 1. 外卖并不好吃   今天下班得早,想吃顿好的,于是就点了一份外卖,过了一会儿,外卖到了,但是在小区大门被堵住了,我亲自远程开门后才能进来,又过了一会,被 ...

  6. DeepLab系列

    论文: (DeepLabV1)Semantic image segmentation with deep convolutional nets and fully connected CRFs (De ...

  7. Object.prototype.__proto__, [[prototype]] 和 prototype

    Object.prototype.__proto__ , [[prototype]] 和 prototype Object.prototype.__proto__ 是什么? __proto__ 是一个 ...

  8. generate_fixed_frame()方法生成Java方法栈帧

    在从generate_normal_entry()函数调用generate_fixed_frame()函数时的栈与寄存器的状态如下: 栈的状态如下图所示. 各个寄存器的状态如下所示. rax: ret ...

  9. Spring Security-获取当前登录用户的详细信息

    在Spring框架里面,可以通过以下几种方式获取到当前登录用户的详细信息: 1. 在Bean中获取用户信息 Authentication authentication = SecurityContex ...

  10. 7. oracle表的管理*

    一.表名和列名的命名规则: 1.必须以字母开头 2.长度不能超过30个字符 3.不能使用oracle的保留字 4.只能使用如下字符 A-Z,a-z,0-9,$,#等 二.Oracle数据类型1.字符类 ...