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

  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. C++内敛函数,构造函数,析构函数,浅拷贝

    inline //inline函数可以有声明和实现,但是必须在同一文件//inline函数不能分成头文件和实现文件 inline int add(int x, int y){ //一般不要放循环语句 ...

  2. Android-NDK开发——基本概念

    在Android开发中,有时候出于安全,性能,代码共用的考虑,需要使用C/C++编写的库.虽然在现代化工具链的支持下,这个工作的难度已经大大降低,但是毕竟万事开头难,初学者往往还是会遇到很多不可预测的 ...

  3. 了解O2OA(翱途)开发平台中的VIP应用

    使用O2OA(翱途)开发平台可以非常方便地进行项目的业务需求开发与实施,O2OA(翱途)开发平台并不限制实现的系统类型,所以能实现的系统很多,最终呈现的项目成果也是多样性的,可能是OA系统,可能是人力 ...

  4. Python Django 模版全解与实战

    本文首先介绍了Django模板系统的基础知识,接着探讨了如何安装和配置Django模板系统,然后深入解析了Django模板的基本结构.标签和过滤器的用法,阐述了如何在模板中展示模型数据,最后使用一个实 ...

  5. EC600U-4G模组,连接阿里云测试服务器和物联网平台

    原博主视频:https://www.bilibili.com/video/BV1yT4y1P7Gw?share_source=copy_web 连接阿里云服务器 !!需要公网ip(服务器)才能远程,不 ...

  6. Linux下实现程序开机自启(rc.local 和 systemctl)

    需求: 实现了一个程序,需要在ubuntu上跑起来.能开机自启,且崩溃了也能自己重启.有两种实现方式,个人推荐第二种. 方式1: 实现方式: 直接将要启动程序的运行命令加在 /etc/rc.local ...

  7. 2021-10-08 Core的LaunchSettings文件说明

    { "iisSettings": { //是否以IIS Express启动 "windowsAuthentication": false, //是否启用wind ...

  8. 王道oj/problem12(动态申请内存存储数组)

    网址:http://oj.lgwenda.com/problem/12 思路:用输入的整型创建对应数组,用scanf消除换行键: 用gets()输入语句并输出,再释放. 代码: #define _CR ...

  9. 记一次 .NET某培训学校系统 内存碎片化分析

    一:背景 1. 讲故事 前些天有位朋友微信上找到我,说他们学校的Web系统内存一直下不去,让我看下到底是怎么回事,老规矩让朋友生成一个dump文件丢给我,看一下便知. 二:WinDbg 分析 1. 托 ...

  10. 青少年CTF平台-Web-PingME

    题目描述 题目难度一颗星,五十分. 解题记录 进入题目中,发现这是一个ping功能 我们用连字符||进行分割两个语句,保证同时运行且输出. Payload为127.0.0.1 || ls 发现有fla ...