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

这篇具有很好参考价值的文章主要介绍了用策略模式干掉代码里大量的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分支的种类,不同种类有不同实现,-----实现

  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,使用时候去容器里面取出来执行业务方法就完事文章来源地址https://www.toymoban.com/news/detail-712004.html

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格由面向过程转为面向对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 策略模式+Spring配置类优化多if..else思路

    场景: 假设设备上报不同类型的消息,我们要对不同类型的消息做不同的处理。如果我们通过if..else的方式处理的话会显得比较冗余。 例如: 那么对于不同消息的不同的处理逻辑我们可以单独放在一个实现类中,这些类有着相同的行为,所以我们可以定义一个接口: 针对于不

    2024年02月15日
    浏览(33)
  • 记录--卸下if-else 侠的皮衣!- 策略模式

    给我一个功能,我总是要写很多if-else,虽然能跑,但是维护起来确实很难受,每次都要在一个方法里面增加逻辑,生怕搞错,要是涉及到支付功能,分分钟炸锅 我总是不知道之前写的逻辑在哪里,一个方法几百行逻辑,而且是不同功能点冗余在一起!这可能让我牺牲大量时间

    2024年02月16日
    浏览(33)
  • 不需要策略模式也能避免满屏if/else

    java 复制代码 public static void main(String[] args) { int a = 1; if(a == 1){ System.out.println(\\\"执行a=1的逻辑\\\"); }else if (a == 2){ System.out.println(\\\"执行a=2的逻辑\\\"); }else if (a == 3){ System.out.println(\\\"执行a=3的逻辑\\\"); }else if (a == 4){ System.out.println(\\\"执行a=4的逻辑\\\"); }else if (a == 5){ System.out.println(\\\"执行a=5的逻辑

    2024年02月06日
    浏览(78)
  • 设计模式之【策略模式】,去掉繁琐的if-else,实现算法的动态替换

    全网最全最细的【设计模式】总目录,收藏起来慢慢啃,看完不懂砍我 策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),它是将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。属于行为型模式。 策略模式使用

    2024年02月09日
    浏览(34)
  • Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

     前言:在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿,这边我就举一个我在实际开发中的例子,来进行阐述这两种模式在实际开发中我是如何运用的。 目录 一、工厂模式简介 二、简单工厂模式 2.1、UML类图

    2024年02月15日
    浏览(24)
  • 为什么很多程序员不用switch,而是大量 的if......else if?

    不会吧还有人用if else和switch case?三目运算符? 不会吧? 不会吧?大佬都是全都不用的!以JAVA为例 条件判断语句的四种写法,茴字的四种写法大家不会不知道吧 1.正常人写法: //输出 :张三应该去男厕所 2.Lambda策略模式写法: 某些大公司P6级别以上(年薪30w-50w)标准写法

    2024年02月15日
    浏览(43)
  • 如何 Java 中的大量的 if else 判断?

    目录 问题出现: 如何 Java 中的大量的 if else 判断? 解决方案:    1.策略模式     2.工厂模式     3.映射表    4.反射+配置文件------极力推荐使用!!!!! 在编写Java相关程序时,我们经常遇到:  大量的 if  else 语句,无不让人内心疯狂,这都是些啥代码啊!!!!!

    2024年02月10日
    浏览(27)
  • 【状态模式】拯救if-else堆出来的屎山代码

    我想大家平时都在开发重都遇见过屎山代码,这些屎山代码一般都是由于复杂且庞大的if-else造成的,状态模式,是一种很好的优化屎山代码的设计模式,本文将采用两个业务场景的示例来讲解如何使用状态模式拯救屎山代码。 目录 前言 1.网购业务场景 1.1.需求 1.2.if else的实

    2024年02月12日
    浏览(31)
  • 如何优雅的在SpringBoot中编写选择分支,而不是大量if else?

    部门通常指的是在一个组织或企业中组成的若干人员,他们共同从事某一特定工作,完成共同的任务和目标。在组织或企业中,部门通常是按照职能、工作性质或业务范畴等因素进行划分的,如财务部门、人力资源部门、市场部门等。 部门编号是公司或组织内部对不同职能部

    2024年02月08日
    浏览(34)
  • 策略模式详解+代码案例

    首先简单介绍策略模式 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管

    2024年04月17日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包