阿里一面,谈谈策略模式在云原生项目中的使用

简介: 在一个成熟的框架中,经常会看到设计模式,比如在springboot的源码里面也是随处可见的。在所有的设计模式中,策略模式是最通用,也是最能体现一个开发思想的设计模式。那么什么是策略模式呢?策略模式就是针对每一种场景有对应的策略,支持横向扩展。也就是说,把选择何种策略的机会交给调用者,将策略构建和选择策略进行一个解耦,提高业务的扩展性和代码的健壮性。不过也要注意,不能过于设计,也就是说不能因为要使用策略模式而忽略了基础的if else。**代码还是越简单越好,越是复杂的功能,越能通过简单的代码实.....

1、什么是策略模式

在一个成熟的框架中,经常会看到设计模式,比如在springboot的源码里面也是随处可见的。在所有的设计模式中,策略模式是最通用,也是最能体现一个开发思想的设计模式。

那么什么是策略模式呢?策略模式就是针对每一种场景有对应的策略,支持横向扩展。也就是说,把选择何种策略的机会交给调用者,将策略构建和选择策略进行一个解耦,提高业务的扩展性和代码的健壮性。

不过也要注意,不能过于设计,也就是说不能因为要使用策略模式而忽略了基础的if else。代码还是越简单越好,越是复杂的功能,越能通过简单的代码实现,那么才是最厉害的技术。

2、为什么要用策略模式

通过第一部分可知,策略模式可以明显的提高业务的扩展性和代码的健壮性。

对于我们开发者而言,策略模式最直观的体现就是去掉了一大堆的if else。比如在一些核心的业务步骤里面,如果出现了很多的if else,那么就会导致后面这块代码无人敢动,也没人敢维护,很不利于项目的稳定运行和发展。

还有一个好处就是,基于策略模式,我们可以通过各个实现类进行自己的业务处理,很好的体现了高内聚低耦合的编程思想。

最后就是,如果你在项目中使用了策略模式,也能把它说的明白,那么在以后的面试中,这将会是一个很重要的加分项。

3、如何使用策略模式

策略模式的定义和好处,我们都已经了解了,那么我们应该怎么使用策略模式呢?

在企业项目中,当我们接到产品的需求时,我们首先要对自己的业务进行一个功能设计,分清楚哪些是核心业务,哪些是次要业务。然后看核心业务是否需要支持横向扩展,如果需要,那么我们才进行策略模式的设计。

假设存在这样一种业务需求:

随着业务的发展,你们公司需要接入自己的支付系统。虽然前期可能只有一种支付供应商,如支付宝,但是随着用户量的增长,为了提升用户好感,你们的产品经理肯定会提出接入其他支付供应商,如微信支付、银联支付等。那么为了减小核心代码的变动,我们可以在设计之初就使用策略模式进行考虑。

所有的策略模式都需要一个容器(上下文)进行存储,也就是context,然后在使用策略的时候可以直接从该context里面拿出来。

各个类的关系如下:
在这里插入图片描述

3.1 定义支付基类和核心抽象方法

支付基类里面主要包含context和一些抽象方法,同时对外提供一个统一的支付调用方法

/**
 * @author yinfeng
 * @description 支付基类
 * @since 2022/6/7 22:06
 */
public abstract class BasePay {

    public BasePay() {
        // 子类实例化的同时将自己注入context中
        CONTEXT.put(this.getType(), this);
    }


    /**
     * 策略模式容器
     */
    public final static Map<String, BasePay> CONTEXT = new ConcurrentHashMap<>(10);

    /**
     * 支付方法,子类实现
     */
    public abstract void pay();

    /**
     * 策略标识,子类实现
     *
     * @return type
     */
    public abstract String getType();

    public static void toPay(String type) {
        final BasePay payService = CONTEXT.get(type);
        if (Objects.isNull(payService)) {
            throw new IllegalArgumentException("未找到对应的支付实现类");
        }
        payService.pay();
    }

}

3.2 支付宝支付实现类

/**
 * @author yinfeng
 * @description 支付宝支付
 * @since 2022/6/7 22:32
 */
public class AliPay extends BasePay {
    @Override
    public void pay() {
    // TODO 复杂的支付逻辑
        System.out.println("支付宝支付成功");
    }

    @Override
    public String getType() {
        return "alipay";
    }
}

3.3 微信支付实现类


/**
 * @author yinfeng
 * @description 微信支付
 * @since 2022/6/7 22:32
 */
public class WxPay extends BasePay{

    @Override
    public void pay() {
    // TODO 复杂的支付逻辑
        System.out.println("微信支付成功");
    }

    @Override
    public String getType() {
        return "wx";
    }

}

3.4 银联支付实现类

/**
 * @author yinfeng
 * @description 银联支付
 * @since 2022/6/7 22:33
 */
public class BankPay extends BasePay {

    @Override
    public void pay() {
        // TODO 复杂的支付逻辑
        System.out.println("银联支付成功");
    }

    @Override
    public String getType() {
        return "bank";
    }
}

3.4 写个测试类测试一下

/**
 * @author yinfeng
 * @description 支付测试类
 * @since 2022/6/7 22:34
 */
public class PayTest {

    public static void main(String[] args) {
        // 假如接口来的参数是任意的 wx/alipay/bank
        final List<String> payList = Arrays.asList("wx", "alipay", "bank");
        final Random random = new Random();
        for (int i = 0; i < 200; i++) {
            String type = payList.get(random.nextInt(3));
            System.out.println("type=" + type);
            BasePay.toPay(type);
        }

    }

    /*
      初始化所有支付实现类
     */
    static {
        new WxPay();
        new AliPay();
        new BankPay();
    }
}

测试效果如下:
在这里插入图片描述

可以看到我们的测试效果已经能满足咱们的需求,同时支付实现类也支持==横向扩展==,通过策略模式很好地提高我们代码的健壮性。

4、总结

学习很多时候都不一定能马上看到效果,但只要你学了总有一天会用到,希望大家能坚持学习。

策略模式是一种很重要的设计思想,在我们的项目中可以经常用到。掌握了这个设计思想,对于我们以后的项目设计和面试都会有很大的帮助,最后祝大家找到自己心怡的工作。

目录
相关文章
|
11月前
|
边缘计算 运维 Kubernetes
阿里云原生容器服务产品体系-阿里云边缘容器服务ACK@Edge介绍
阿里云原生容器服务产品体系-阿里云边缘容器服务ACK@Edge介绍
1060 0
阿里云原生容器服务产品体系-阿里云边缘容器服务ACK@Edge介绍
|
3月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云原生数据库 PolarDB MySQL:云原生时代的数据库新篇章
阿里云原生数据库 PolarDB MySQL,它是阿里云自主研发的下一代云原生关系型数据库。PolarDB具有多主多写、多活容灾、HTAP等特性,交易性能和存储容量均表现出色。此外,PolarDB MySQL Serverless具有动态弹性升降资源和全局一致性等特性,能够适应高吞吐写入和高并发业务场景。本文详细分析了PolarDB的性能、稳定性和可扩展性,以及它在成本、性能和稳定性方面的优势。PolarDB为企业提供了高效、可靠的数据库解决方案,是值得考虑的选择。
349 0
|
3月前
|
Cloud Native 关系型数据库 OLAP
云原生数据仓库产品使用合集之阿里云云原生数据仓库AnalyticDB PostgreSQL版的重分布时间主要取决的是什么
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
1月前
|
存储 Kubernetes Cloud Native
云原生周刊:Score 成为 CNCF 沙箱项目
以下是内容的摘要,格式为Markdown: 开源项目: - [Trident]:NetApp维护的开源存储解决方案,支持容器化应用的持久化存储,兼容CSI接口。 - [Monokle]:Kubernetes YAML编辑器,简化配置创建、分析和部署。 - [Platform Aware Scheduling]:模块化策略驱动的Kubernetes调度器扩展,考虑平台特性。 - [cdebug]):容器和Pod故障排查工具,提供端口转发、文件系统导出等功能。
|
3月前
|
Cloud Native 数据管理 关系型数据库
【阿里云云原生专栏】云原生数据管理:阿里云数据库服务的分布式实践
【5月更文挑战第21天】阿里云数据库服务在云原生时代展现优势,应对分布式数据管理挑战。PolarDB等服务保证高可用和弹性,通过多副本机制和分布式事务确保数据一致性和可靠性。示例代码展示了在阿里云数据库上进行分布式事务操作。此外,丰富的监控工具协助用户管理数据库性能,支持企业的数字化转型和业务增长。
210 1
|
3月前
|
运维 Cloud Native 持续交付
【阿里云云原生专栏】从零到一搭建云原生应用:阿里云云原生应用平台实战教程
【5月更文挑战第24天】本文档是一份阿里云云原生应用平台的实战教程,介绍了如何从零开始搭建云原生应用。内容涵盖云原生应用的特点(容器化、微服务、CI/CD和自动化运维)以及阿里云提供的服务,如容器服务、服务网格和CI/CD工具。教程详细讲解了创建容器集群、编写Dockerfile、构建镜像、部署应用、配置服务网格和设置CI/CD的步骤。通过本文,读者将学会利用阿里云平台开发和管理云原生应用。
388 0
|
3月前
|
Kubernetes Cloud Native Devops
云原生技术落地实现之二KubeSphere DevOps 系统在 Kubernetes 集群上实现springboot项目的自动部署和管理 CI/CD (2/2)
云原生技术落地实现之二KubeSphere DevOps 系统在 Kubernetes 集群上实现springboot项目的自动部署和管理 CI/CD (2/2)
111 1
|
11月前
|
Kubernetes Cloud Native 安全
阿里云原生容器服务产品体系-ACK Pro 托管集群
阿里云原生容器服务产品体系-ACK Pro 托管集群
309 0
阿里云原生容器服务产品体系-ACK Pro 托管集群
|
11月前
|
Kubernetes Cloud Native 双11
阿里云原生容器服务产品体系-阿里云容器服务体系概述
阿里云原生容器服务产品体系-阿里云容器服务体系概述
766 0
阿里云原生容器服务产品体系-阿里云容器服务体系概述
|
3月前
|
人工智能 Cloud Native Serverless
邀请报名|12月22日阿里云原生 Serverless 技术实践营 西安站
12月22日,西安 · 阿里中心举办阿里云原生 Serverless 技术实践营
邀请报名|12月22日阿里云原生 Serverless 技术实践营 西安站

热门文章

最新文章