还在用繁琐的if..else,试试策略模式吧!

简介: 应该有不少码友遇到过充斥着if else的代码,面对这样的一团乱麻,简单粗暴地继续增量修改常常只会让复杂度越来越高,可读性越来越差。那么是时候重构了,花几分钟看看这篇文章, 说不定对你有一丢丢帮助。

前言

应该有不少码友遇到过充斥着if else的代码,面对这样的一团乱麻,简单粗暴地继续增量修改常常只会让复杂度越来越高,可读性越来越差。那么是时候重构了,花几分钟看看这篇文章, 说不定对你有一丢丢帮助。

业务场景

有这么一个小需求,需要对不同类型的用户进行不同规则的操作,场景大概如下所示:

if (普通用户) {
 // 此处省略...
}
if (会员用户) {
  // 此处省略...
}
if (钻石用户) {
  // 此处省略...
}
复制代码

按照上述的条件我们可以得出的结论是:

根据现在的流程来看,如果有一个不匹配的话,其实后续的流程是不用执行的,就是需要具备一个短路的功能。对于目前的现状来说,如果在原有的基础上来改,只要稍微注意一下解决现在的需求不是很大的问题,但是后面可维护性非常差。

策略模式

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

这个模式涉及到三个角色:

  • 环境(Context)角色:持有一个Strategy的引用。
  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

优化方案

使用普通的策略模式进行优化。

1.定义接口:

public interface Type {
    /**
     * 获取类型,返回集合
     */
    Bollean userRule();
}
复制代码

2.定义 UserType(普通)实现 Type 接口:

@Service
public class UserType implements Type {
    @Override
    public Bollean userRule() {
        // 此处省略普通用户的规则操作...
        return true;
    }
}
复制代码

3.定义 VIPUserType(vip用户)实现 Type 接口:

@Service
public class VIPUserType implements Type {
    @Override
    public Bollean userRule() {
        // 此处省略普通用户的规则操作...
        return true;
    }
}
复制代码

4.定义策略工厂类:

public class TypeFactory {
    private static TypeFactory typeFactory = new TypeFactory();
    // 定义Map
    private static Map<Integer,Type> map = new HashMap<>();
    static{
        map.put(1, new UserType());
        map.put(2, new VIPUserType())
    }
    public static TypeFactory getInstance(){
        return typeFactory;
    }
    public Type getByType(Integer type){
        return map.get(type);
    }
}
复制代码

5.使用

TypeFactory.getInstance().getByType(1).userRule();
复制代码

问题

在上面策略模式中如果在实现类 UserType 中使用

@Autowired
private Dao dao;
复制代码

就会出现 空指针的情况

java.lang.NullPointerException
复制代码

因为 发现策略实现中的Dao接口注入的都是Null。

改造

@Service("userType")
public class UserType implements Type {
    @Autowired
    private Dao dao;
    @Override
    public Bollean userRule() {
        // 此处省略普通用户的规则操作...
        return true;
    }
}
复制代码
@Service("vIPUserType")
public class VIPUserType implements Type {
    @Autowired
    private Dao dao;
    @Override
    public Bollean userRule() {
        // 此处省略普通用户的规则操作...
        return true;
    }
}
复制代码
public class TypeFactory {
    @Resource
    @Qualifier("userType")
    private  UserType userType;
    @Resource
    @Qualifier("vIPUserType")
    private  VIPUserType vIPUserType;
    public  Type getByType(Integer type){
        Map<Integer, Type> map = new HashMap<>();
        map.put(1, userType);
        map.put(2, vIPUserType);
        return map.get(type);
    }
}
复制代码
public class Test {
    // 工厂注入
    @Autowired
    private TypeFactory typeFactory;
    @GetMapper("/test")
    public void test(Integer type) {
        typeFactory.getByType(type).getType()
    }
}


相关文章
|
Shell
遇到INSTALL_FAILED_VERIFICATION_FAILURE怎么办
遇到INSTALL_FAILED_VERIFICATION_FAILURE怎么办
1391 0
|
11天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
9天前
|
存储 人工智能 搜索推荐
终身学习型智能体
当前人工智能前沿研究的一个重要方向:构建能够自主学习、调用工具、积累经验的小型智能体(Agent)。 我们可以称这种系统为“终身学习型智能体”或“自适应认知代理”。它的设计理念就是: 不靠庞大的内置知识取胜,而是依靠高效的推理能力 + 动态获取知识的能力 + 经验积累机制。
342 130
|
9天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
429 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
3天前
|
存储 安全 前端开发
如何将加密和解密函数应用到实际项目中?
如何将加密和解密函数应用到实际项目中?
201 138
|
9天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
385 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
3天前
|
存储 JSON 安全
加密和解密函数的具体实现代码
加密和解密函数的具体实现代码
202 136
|
21天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1356 8