用策略模式干掉代码里大量的if-eles或则Swatch,提升B格由面向过程转为面向对象
现象 大量的分支选择型代码段看着让人头疼
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分支的种类,不同种类有不同实现,-----实现
- 比如 类型抽象 有String 类型 实现
public class StringStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "VARCHAR");
}
}
- 比如 类型抽象 有Integer 类型 实现
public class IntegerStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "NUMERIC");
}
}
- 比如 类型抽象 有Double 类型 实现
public class DoubleStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "NUMERIC");
}
}
- 比如 类型抽象 有Date 类型 实现
public class DateStrategy implements FileTypeInterfaceStrategy {
@Override
public void addAttribute(Element element) {
element.addAttribute("jdbcType", "DATE");
}
}
- 比如 类型抽象 有其他 类型 实现
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格由面向过程转为面向对象的更多相关文章
- Python设计模式: 最佳的"策略"模式实践代码
Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...
- JS是面向过程、面向对象还是基于对象?面向对象的代码体现
一.问题 javascript是面向对象的,还是面向过程的?基于对象是什么意思? 对象: 指的是对某一类事物进行抽象,抽象出这一类事物共同的特征以及行为(也就是属性和方法),那些拥有这一共同属性和方法 ...
- 如何在Spring Boot项目中巧妙利用策略模式干掉if else!
直入主题 我们都知道,设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性 ...
- 策略模式干掉if-else,switch
1.传统if -else 写法 String nodeModelStr = ""; if (nodeType == NodeType.START){ StartModel star ...
- 设计模式入门,策略模式,c++代码实现
// test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...
- php设计模式之策略模式实例代码
html <html> <head> <meta charset="UTF-8"> <title>简单计算器</title&g ...
- 使用策略模式重构switch case 代码
目录 1.背景 2.案例 3.switch…case…方式实现 4.switch…case…带来的问题 5.使用策略模式重构switch…case…代码 6.总结 1.背景 之前在看<重构 ...
- 深入浅出设计模式——策略模式(Strategy Pattern)
模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务.在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可 ...
- 理解javascript中的策略模式
理解javascript中的策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 使用策略模式的优点如下: 优点:1. 策略模式利用组合,委托等技术和思想,有效 ...
- JavaScript设计模式与开发实践 - 策略模式
引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...
随机推荐
- GPT3的技术突破:实现更精准的语义分析
目录 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 6. 结论与展望 7. 附录:常见问题与解答 GPT-3技术突破:实现更精准的语义分析 近年来,人工智 ...
- 即构低延迟直播产品L3,打造更优质的实时互动体验
以短视频.直播为代表的音视频互动,正成为互联网主流的交互方式.拿直播举例,它从一种娱乐形式,逐渐融合于教育.娱乐.电商.旅游等多种生态中.未来,直播还将成为像水.电一样的基础设施. 然而,仅仅可进行音 ...
- 论文日记四:Transformer(论文解读+NLP、CV项目实战)
导读 重磅模型transformer,在2017年发布,但就今天来说产生的影响在各个领域包括NLP.CV这些都是巨大的! Paper<Attention Is All You Need>, ...
- 2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式 有效的表达式需遵循以下约定: ‘t‘,运算结果为 true ‘f‘,运算结果为 false ‘!(subExpr
2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式 有效的表达式需遵循以下约定: 't',运算结果为 true 'f',运算结果为 false '!(subExpr ...
- Tomcat改jar
Tomcat改jar 插件修改 <!-- <plugin>--> <!-- <groupId>org.apache.maven.plugins</gro ...
- Unity UGUI的LayoutElement(布局元素)组件的介绍及使用
Unity UGUI的LayoutElement(布局元素)组件的介绍及使用 1. 什么是LayoutElement组件? LayoutElement是Unity UGUI中的一个布局元素组件,用于控 ...
- ABP 的ajax请求错误:400 Empty or invalid anti forgery header token.
ABP 的ajax请求错误 记录于2018-03-22 13:31:16 星期四 错误信息:400 Empty or invalid anti forgery header token. 我从网上找到 ...
- 【go语言】2.1.3 函数的定义和使用
在 Go 语言中,函数是一种代码抽象和复用的方式.函数可以接受参数,执行特定的操作,并返回结果. 函数的定义 函数的定义以 func 关键字开始,后面跟着函数名.参数列表.返回值列表(可选)以及函数体 ...
- UPS设备在物流机房中的应用浅析
1 UPS 简介 UPS 即不间断电源 (Uninterruptible Power Supply),是一种含有储能装置的不间断电源.主要用于给部分对电源稳定性要求较高的设备,提供不间断的电源. 当市 ...
- [mysql]定制封装MySQL的docker镜像
前言 基于MySQL的原版镜像做一些个性化配置修改,封装/etc/my.cnf文件到镜像中,并且支持通过环境变量修改innodb_buffer_pool_size.server_id以及自动配置inn ...