首页 > 其他分享 >告别满屏的if/else,用了策略模式后让你的代码更优雅

告别满屏的if/else,用了策略模式后让你的代码更优雅

时间:2024-10-23 09:47:13浏览次数:3  
标签:public paydemo 满屏 优雅 IPayService 支付 import else Order

你还在写满屏的 if/ else/ switch 之类的判断逻辑吗?
博主在开发人员的代码中看过太多这样的低级代码了,真的太 low,极不好维护,本文博主就教你如何用策略模式干掉 if/ else/ switch,让你的代码更优雅。

什么是策略模式?
比如说对象的某个行为,在不同场景中有不同的实现方式,这样就可以将这些实现方式定义成一组策略,每个实现类对应一个策略,在不同的场景就使用不同的实现类,并且可以自由切换策略。
策略模式需要一个策略接口,不同的策略实现不同的实现类,在具体业务环境中仅持有该策略接口,根据不同的场景使用不同的实现类即可。

策略模式实战
举个实际的例子,某公司是做支付的,根据不同的客户类型会有不同的支付方式和支付产品,比如:信用卡、本地支付,而本地支付在中国又有微信支付、支付宝、云闪付、等更多其他第三方支付公司,这时候策略模式就派上用场了。
1、定义策略接口,所有支付方式的接口。

import com.example.paydemo.vo.Order;

/**
 * 支付接口
 */
public interface IPayService {
    String pay(Order order);
}

订单vo类

import lombok.Data;
import java.math.BigDecimal;

@Data
public class Order {
    // 支付金额
    private BigDecimal amount;
    // 支付方式
    private String paymentType;
}

2、定义各种支付策略,微信、支付宝、云闪付等支付实现类都实现这个接口。
微信支付实现

import com.example.paydemo.service.IPayService;
import com.example.paydemo.vo.Order;
import org.springframework.stereotype.Service;

/**
 * 微信支付实现类
 */
@Service("WechatPay")
public class WechatPayServiceImpl implements IPayService {
    @Override
    public String pay(Order order) {
        return "微信支付成功";
    }
}

支付宝实现

import com.example.paydemo.service.IPayService;
import com.example.paydemo.vo.Order;
import org.springframework.stereotype.Service;

/**
 * 支付宝支付实现类
 */
@Service("AliPay")
public class AliPayServiceImpl implements IPayService {
    @Override
    public String pay(Order order) {
        return "支付宝支付成功";
    }
}

云闪付实现

import com.example.paydemo.service.IPayService;
import com.example.paydemo.vo.Order;
import org.springframework.stereotype.Service;

/**
 * 云闪付支付实现类
 */
@Service("UnionPay")
public class UnionPayServiceImpl implements IPayService {
    @Override
    public String pay(Order order) {
        return "云闪付支付成功";
    }
}

这里我把所有支付方式类都用 @Service 注解生成 Bean 放入 Spring Bean 容器中了,在使用策略的时候就不用 new 支付对象了,可以直接使用 Bean,这样更贴近业务。
3、使用策略调用

import com.example.paydemo.service.IPayService;
import com.example.paydemo.vo.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;

@RestController
public class PayController {
    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 支付
     *
     * @param amount      is 支付金额
     * @param paymentType is 支付方式
     * @return 支付结果
     */
    @GetMapping("/pay")
    public String pay(@RequestParam("amount") BigDecimal amount, @RequestParam("paymentType") String paymentType) {
        Order order = new Order();
        order.setAmount(amount);
        order.setPaymentType(paymentType);
        // 根据支付类型获取对应的策略bean
        IPayService payService = applicationContext.getBean(order.getPaymentType(), IPayService.class);
        // 调用支付接口
        String result = payService.pay(order);
        // 返回支付信息
        return result;
    }
}

测试一下:根据前端传入不同的支付方式参数,spring容器加载不同的实现类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试 OK,传入不同的支付方式会调用不同的策略。

标签:public,paydemo,满屏,优雅,IPayService,支付,import,else,Order
From: https://blog.csdn.net/firstMeet01/article/details/143174555

相关文章

  • 如何优雅的创建iso文件
    闲言这件事可以非常简单进入这个链接FreeISOCreator下载最新软件即可https://www.freeisocreator.com/为防止无法访问,我放到百度网盘里了FreeISOCreatorpassword:llll安装正常安装软件即可,可不必看安装流程但我要写点击打开-next选择位置(需提......
  • Mirascope: 优雅简洁的Python LLM库
    Mirascope简介Mirascope是一个为Python开发者设计的优雅简洁的大语言模型(LLM)库。它的目标是为LLMAPI提供类似于requests库对http的开发体验。Mirascope的核心理念是提供恰到好处的抽象,让开发者能够以自己的方式构建LLM应用,同时保持模块化、可扩展和可靠性。MirascopeLogo......
  • Optional指南,优雅解决空指针
    Optional,该类提供了一种用于表示可选值而非空引用的类级别解决方案。作为一名Java程序员,我真的是烦透了空指针,尽管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一个对象却发现这个对象的值为null,于是Java虚拟机就怒发冲冠地把它抛了出来当做替罪羊。当然......
  • HotPE工具箱-一个纯净、强大、优雅的开源Win11PE
    一个纯净、强大、优雅的开源Win11PE,支持上网、声音、远程、下载、HotPE模块、Edgeless插件、MTP丶RNDIS、Legacy、UEFI、M.2、NVME、USB设备弹出、搜索功能、MSI、BitLocker磁盘解锁、网络共享、U盘启动、本地启动、生成ISO等一个纯净、强大、优雅的开源Win11PE,支持上网、声音、......
  • 从多线程到 epoll:如何优雅地处理高并发请求?
    文章参考于:小林coding最近在学习操作系统,服务器与客户端之间的通信离不开socket编程。然而,基于TCP的socket编程在默认情况下只能实现一对一的通信,因为它采用同步阻塞模型。在服务器处理完当前客户端的请求之前,无法响应其他客户端的请求。这种方式效率不高,显然浪费了......
  • WordPress如何优雅地删除没有包含图片的文章
    作为一个在乎用户体验的 SEOer 来说,子凡我不太能够接受文章没有配图,不然就总感觉少了点东西,当然这也是对文章质量的一种提升,但是由于网站中可能会存在一些老旧的文章没有包含任何图片,导致内容显得单薄,影响用户体验。为了提高网站内容的整体质量,删除这些没有图片的文章是一个有效......
  • 解决移动端项目在PC端打开后宽度占满屏幕的问题
    问题描述移动端的项目在PC端打开后,对于带有固定定位的元素,宽度沾满的整个视窗的宽度。即使body,html限制了最大宽度<body><divclass="box"></div></body><style>body{max-width:500px;margin:0;background:#aaa;height:1......
  • UI范式:if/else条件渲染
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • 在K8S中,如何进行优雅的节点关机维护?
    在Kubernetes(K8S)中,进行优雅的节点关机维护是确保集群稳定性和可用性的关键步骤。以下是一个详细的指南,涵盖了从准备到恢复的全过程:1.准备阶段选择合适的时间:选择一个低负载时段进行维护,以减少对用户的影响。通知团队:提前通知相关团队和用户,确保他们了解维护时间和可能的影响......
  • 【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻
    文章目录C++双指针详解:进阶题解与思维分析前言第一章:有效三角形的个数1.1有效三角形的个数示例1:示例2:解法一(暴力求解)解法二(排序+双指针)易错点提示代码解读第二章:和为s的两个数字2.1和为s的两个数字示例1:解法一(暴力解法)解法二(双指针-对撞指针)第三章:三......