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

策略,模式,干掉,代码,大量,if,eles,或则,swatch,提升,面向,过程,转为,面向对象 · 浏览次数 : 115

小编点评

**分析** 这篇文章介绍了一种面向对象编程的思想,即通过创建对象来表示代码逻辑并执行不同的业务方法。 **核心思想** * 将多个if分支抽象化成对象行为编程。 * 使用工厂方法选择执行不同的业务方法。 * 将策略模式与面向对象编程相结合。 **代码示例** ```java public class FileTypeStrategyFactory { private FileTypeStrategyFactory() { } private static final FileTypeStrategyFactory bean = new FileTypeStrategyFactory(); public static FileTypeStrategyFactory getBean() { return bean; } public FileTypeInterfaceStrategy getStrategy(String classType) { return factoryMap.get(classType) != null ? factoryMap.get(classType) : factoryMap.get("default"); } private static Map factoryMap = new HashMap<>(); static { 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()); } } ``` **优点** * 代码更易读和维护。 * 降低了代码重复性。 * 将多个 if分支转换为对象行为编程。 * 提高了代码可重用性。 **缺点** * 可能需要为每个字段创建相应的策略类。 * 需要创建工厂类来管理策略。 * 可能会增加内存使用量。

正文

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

  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格由面向过程转为面向对象相似的内容:

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

现象 大量的分支选择型代码段看着让人头疼 for (Field field : declaredFields) { Class type = field.getType(); String key = field.getName(); Element result = resultMap.ad

不得不说,在很多业务中,这种模式用得真的很香

title: 不得不说,在很多业务中,这种模式用得真的很香 date: 2024-04-24 22:31:58 permalink: /pages/32af5c/ categories: - 《常用设计模式》笔记 tags: - 策略模式 author: name: 老猫 link: https:/

【算法】用c#实现计算方法中的经典降幂优化策略,减少计算复杂度

对于给定的数组[x1,x2,x3,…,xn],计算幂的累积:x1^(x2^(x3^(…^xn))的最后一位(十进制)数字。 例如,对于数组[3,4,2],您的代码应该返回1,因为3^(4^2)=3^16=43046721。 结果的增长得快得令人难以置信。例如,9^(9^9)有超过3.69亿个数字。你

数据重整:用Java实现精准Excel数据排序的实用策略

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在数据处理或者数据分析的场景中,需要对已有的数据进行排序,在Excel中可以通过排序功能进行整理数据。而在Java中,则可以借助Excel表格插件对数据进行批量排序

PPO近段策略优化玩cartpole游戏

这个难度有些大,有两个policy,一个负责更新策略,另一个负责提供数据,实际这两个policy是一个东西,用policy1跑出一组数据给新的policy2训练,然后policy2跑数据给新的policy3训练,,,,直到policy(N-1)跑数据给新的policyN训练,过程感觉和DQN比较像,

字节面试:MySQL自增ID用完会怎样?

在一些中小型项目开发中,我们通常会使用自增 ID 来作为主键的生成策略,但随着时间的推移,数据库的信息也会越来越多,尤其是使用自增 ID 作为日志表的主键生成策略时,可能很快就会遇到 ID 被用完的情况,那么如果发生了这种情况,MySQL 又会怎样执行呢? PS:当然,在分库分表的场景中,我们通常会

[转帖]Redis学习笔记--Redis数据过期策略详解

本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存session,又或者只存放日行情股票数据)那么就会出现一下几个问题了 Redis会自己回收清理不用的数据吗?

基于SpringBoot应⽤的logback⽇志配置

SpringBoot默认整合了logback-classic⽇志框架,我们需要对logback⽇志框架进⾏配置 以⾃定义⽇志输出格式、⽇志⽂件配置、⽇志⽂件保存策略等信息

PPO-KL散度近端策略优化玩cartpole游戏

其实KL散度在这个游戏里的作用不大,游戏的action比较简单,不像LM里的action是一个很大的向量,可以直接用surr1,最大化surr1,实验测试确实是这样,而且KL的系数不能给太大,否则惩罚力度太大,action model 和ref model产生的action其实分布的差距并不太大 i

[转帖]Linux 监测服务心跳、服务重启策略

文章目录 前言背景一、curl服务可用验证二、服务探测脚本三、配置系统定时任务四、Linux特殊字符转义总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、 提示:以下是本篇文章正文内容,下面案例可供参考 背景 当服务假死情况下,导致服务不可用,一时间定位不到服务假死原因,可以采用