使用场景

如果在代码中出现大量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

最新文章

  1. 从零开始山寨Caffe&#183;贰:主存模型
  2. android设置系统模式
  3. java 网络编程(二)----UDP基础级的示例
  4. 在Java中super和this的区别
  5. MAC OS X 终端命令入门 (简单常用整理)
  6. dedecms织梦二级菜单的实现方法
  7. python文件_写入
  8. C编程的指针涛 ---第十笔记
  9. 可遇不可求的Question之Mysql在不重启服务的情况下修改运行时变量篇
  10. stingray前端架构总体设计及运行过程
  11. linux 之awk命令详解
  12. GSM信道分类
  13. 文件Move操作
  14. 模拟拖拽图片 碰撞检测 DOM 鼠标事件 闭包
  15. ISE和Modelsim联合仿真(详细步骤讲解)
  16. 将ip地址转换成C段地址的UDF
  17. 一条java开发工程师的升级路线,从初级到无语言障碍
  18. 基于Python在MacOS上安装robotframework-ride
  19. gluoncv 目标检测,训练自己的数据集
  20. chromium之message_pump_win之三

热门文章

  1. Linux发行版-Manjaro
  2. OO第一单元(前四周)作业总结
  3. 强化学习 3—— 使用蒙特卡洛采样法(MC)解决无模型预测与控制问题
  4. C#算法设计排序篇之06-堆排序(附带动画演示程序)
  5. 神经网络实现fashion数据集
  6. day11面向对象 多态 静态方法 (三)
  7. Pycharm中对与Python的快捷方式
  8. 微信小程序setData局部刷新列表
  9. 初期web渗透的学习路线
  10. 谈谈BUG严重级别(severity)管理