现象 大量的分支选择型代码段看着让人头疼

  for (Field field : declaredFields) {
Class<?> type = field.getType();
String key = field.getName();
Element result = resultMap.addElement("result");
result.addAttribute("column", StringChangeUtils.CamelhumpToUnderline(key).toLowerCase());
result.addAttribute("property", key);
switch (type.getSimpleName()) {
case "String":
result.addAttribute("jdbcType", "VARCHAR");
break;
case "Integer":
result.addAttribute("jdbcType", "NUMERIC");
break;
case "Double":
result.addAttribute("jdbcType", "NUMERIC");
break;
case "Date":
result.addAttribute("jdbcType", "DATE");
break;
default:
result.addAttribute("jdbcType", "VARCHAR");
break;
} }

如何重构成为策略模式,由硬编码的面向过程编程走向面对对象呢

其实很简单 if里面的多个魔法常量 和HashMap里面的key是不是可以等比互换呢!!

所以我们核心就是从一个类似于HashMap这种的容器里去获取某一个key,就等同于进去到了if 的对应分支

而if 的对应分支 里面的业务,交给HashMap的Value去调方法完成没毛病把

第一步抽象化这个if分支的逻辑 ---- 分析

--比如上述代码是判断字段类型 --->通用对象接口是对象类型的·抽象·

-- 那么这个对象具有什么能力,就是对应原始if分支的逻辑处理 呗,,

-- 我这里是根据不同的字段类型往一个Element元素对象中填充属性。 -----所以抽出行为为往Element元素对象中填充属性

第二步抽象化这个if分支的逻辑----- 实现

public interface FileTypeInterfaceStrategy {

    void addAttribute(Element element);
}

第三步抽象if分支的种类,不同种类有不同实现,-----分析

1. 比如 类型抽象 有String  类型
2. 比如 类型抽象 有Double 类型
3. 比如 类型抽象 有DATE 类型
4. 等等。。。。。

第四步抽象if分支的种类,不同种类有不同实现,-----实现

  1. 比如 类型抽象 有String 类型 实现
public class StringStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "VARCHAR");
}
}
  1. 比如 类型抽象 有Integer 类型 实现
public class IntegerStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "NUMERIC");
}
}
  1. 比如 类型抽象 有Double 类型 实现
public class DoubleStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "NUMERIC");
}
}
  1. 比如 类型抽象 有Date 类型 实现
public class DateStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "DATE");
}
}
  1. 比如 类型抽象 有其他 类型 实现
public class DefaultStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "VARCHAR");
}
}

第五步if分支的过程编程已经抽离为对象行为编程----目前如何嵌入业务分析

 思考  if选择分支,第一件事是不是拿到一个值去判断属于某一个魔法常量呢!
其实 抽离成对象之后业同理需要知道,这里的上文行为需要下文的那一个对象的实现去处理。。
比如,上文中拿到String、类型,我需要使用String类型的实现类去调业务方法。
比如,上文中拿到Integer、类型,我需要使用Integer类型的实现类去调业务方法。

if的分支属性和业务行为被抽离成对象--但是还有个东西没有抽离,就是IF本身的分支选择结构没抽出来 对不对

这时候联想到第一句话:if本身业务结构还需要抽离-----它本身和HashMaP这种结构类似 是不是可以用它完成替换

第六步if分支的过程编程已经抽离为对象行为编程----目前如何嵌入业务实现

使用工厂方法代理策略的选择执行:其实很简单,就是new 一个HashMap,然后把所有的策略对象和Key放入HashMap,使用时候去容器里面取出来执行业务方法就完事

public class FileTypeStrategyFactory {

    private FileTypeStrategyFactory() {

    }

    private static final FileTypeStrategyFactory bean = new FileTypeStrategyFactory();

    public static FileTypeStrategyFactory getBean() {
return bean;
} /**
* 声明存储容器
*/
private static Map<String, FileTypeInterfaceStrategy> factoryMap; static {
factoryMap = new HashMap<>();
factoryMap.put("String", new StringStrategy());
factoryMap.put("Integer", new IntegerStrategy());
factoryMap.put("Double", new DoubleStrategy());
factoryMap.put("Date", new DateStrategy());
factoryMap.put("default", new DefaultStrategy());
} public FileTypeInterfaceStrategy getStrategy(String classType) {
return factoryMap.get(classType) != null ? factoryMap.get(classType) : factoryMap.get("default");
}
}

替换原始代码;

        Element resultMap = document.addElement("resultMap");
// 添加根节点属性
resultMap.addAttribute("id", aClass.getSimpleName() + "Map");
resultMap.addAttribute("type", classForName);
resultMap.addAttribute("extends", "BaseResultMap");
for (Field field : declaredFields) {
Class<?> type = field.getType();
String key = field.getName();
Element result = resultMap.addElement("result");
result.addAttribute("column", StringChangeUtils.CamelhumpToUnderline(key).toLowerCase());
result.addAttribute("property", key);
FileTypeStrategyFactory factory = FileTypeStrategyFactory.getBean();
FileTypeInterfaceStrategy strategy = factory.getStrategy(type.getSimpleName());
strategy.addAttribute(result);
}

策略模式+工厂方法 ----->无缝替换if-else-switch:面向过程---到面向对象是思维的转变 完结!!!!

用策略模式干掉代码里大量的if-eles或则Swatch,提升B格由面向过程转为面向对象的更多相关文章

  1. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  2. JS是面向过程、面向对象还是基于对象?面向对象的代码体现

    一.问题 javascript是面向对象的,还是面向过程的?基于对象是什么意思? 对象: 指的是对某一类事物进行抽象,抽象出这一类事物共同的特征以及行为(也就是属性和方法),那些拥有这一共同属性和方法 ...

  3. 如何在Spring Boot项目中巧妙利用策略模式干掉if else!

    直入主题 我们都知道,设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性 ...

  4. 策略模式干掉if-else,switch

    1.传统if -else 写法 String nodeModelStr = ""; if (nodeType == NodeType.START){ StartModel star ...

  5. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

  6. php设计模式之策略模式实例代码

    html <html> <head> <meta charset="UTF-8"> <title>简单计算器</title&g ...

  7. 使用策略模式重构switch case 代码

    目录 1.背景 2.案例 3.switch…case…方式实现 4.switch…case…带来的问题 5.使用策略模式重构switch…case…代码 6.总结 1.背景 之前在看<重构    ...

  8. 深入浅出设计模式——策略模式(Strategy Pattern)

    模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务.在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可 ...

  9. 理解javascript中的策略模式

    理解javascript中的策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 使用策略模式的优点如下: 优点:1. 策略模式利用组合,委托等技术和思想,有效 ...

  10. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

随机推荐

  1. Godot 4.0 遮罩一个2D物体,使其部分显示

    本文针对Godot 4.0. 我也查到了Godot 3.5如何实现遮罩,见这个链接 https://ask.godotengine.org/3031/how-do-i-mask-a-sprite 由于 ...

  2. ASP.NET Core 6框架揭秘实例演示[37]:重定向的N种实现方式

    在HTTP的语义中,重定向一般指的是服务端通过返回一个状态码为3XX的响应促使客户端像另一个地址再次发起请求,本章将此称为"客户端重定向".既然有客户端重定向,自然就有服务端重定向 ...

  3. java匿名内部类的初解

    java原生态中的匿名内部类 1.匿名内部类的定义 使用匿名内部类的两种的方法 建立父类,重写父类的方法 实现接口的方法 2.普通类的实现 1. 普通类实现 实现普通类需要先声明对一个类的对象,再调用 ...

  4. 前端仿新浪新闻 tabs 选项卡tabs标签页,根据文字多少自适应 tab项宽度

    前端仿新浪新闻 tabs 选项卡tabs标签页,根据文字多少自适应 tab项宽度, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?i ...

  5. 浅谈OpenCV的多对象匹配图像的实现,以及如何匹配透明控件,不规则图像

    浅谈OpenCV的多对象匹配透明图像的实现,以及如何匹配半透明控件 引子 OpenCV提供的templateMatch只负责将(相关性等)计算出来,并不会直接提供目标的对应坐标,一般来说我们直接遍历最 ...

  6. 2023-06-25:redis中什么是缓存穿透?该如何解决?

    2023-06-25:redis中什么是缓存穿透?该如何解决? 答案2023-06-25: 缓存穿透 缓存穿透指的是查询一个根本不存在的数据,在这种情况下,无论是缓存层还是存储层都无法命中.因此,每次 ...

  7. Java 使用ArrayList获取10个1-20之间的随机数,要求不能重复

    代码如下: public static void main(String[] args) { List<Integer> nums = new ArrayList<Integer&g ...

  8. 安装Hadoop单节点伪分布式集群

    目录 安装Hadoop单节点伪分布式集群 系统准备 开启SSH 安装JDK 安装Hadoop 下载 准备启动 伪分布式模式安装 配置 配饰SSH免密登录本机 测试启动 单节点安装YARN 伪分布式集群 ...

  9. Flutter 屏幕采集如何实现(提供示例demo)

    在视频会议.线上课堂.游戏直播等场景,屏幕共享是一个最常见的功能.屏幕共享就是对屏幕画面的实时共享,端到端主要有几个步骤:录屏采集.视频编码及封装.实时传输.视频解封装及解码.视频渲染.一般来说,实时 ...

  10. Rust 学习笔记:快速上手篇

    Rust 学习笔记:快速上手篇 这篇学习笔记将用于记录本人在快速上手 Rust 编程语言时所记录的学习心得与代码实例.为此,我会在本笔记库项目的Programming/LanguageStudy/目录 ...