java如何优雅的写业务逻辑_写出优雅的业务代码(1):项目中的模版方法,策略模式...

关键字:

如何写好业务代码

业务架构

设计模式

模版方法

策略模式

工厂模式

本文概要:

对于做web开发的java程序员来说,如何写出更好看的业务代码。本文会展示利用设计模式中模版方法,策略,工厂3种模式来优化平铺直叙的代码。

业务简介:

开始之前需要先了解一下业务。

业务是通过调用支付宝接口来做支付订单。

业务中有10种订单类型。

通过接口参数里的payType参数确定是哪种订单,然后执行对应的订单分支逻辑,调用阿里支付,返回交易编号

优化前的部分代码如下:

http接口接收订单类型参数,然后调用service的getPayInfo方法时传入这个类型。

7cef2d6b8579?utm_campaign=haruki&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

001

getPayInfo方法根据参数payType做switch case,这本身没有太大问题,但是清注意,每一个case里,代码都分为2个步骤,步骤1准备参数,步骤2调用与case对应的方法,并且每个方法的参数个数一样,类型除了最后一个之外,也都是一样的。

7cef2d6b8579?utm_campaign=haruki&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

002

上面case语句里调用的方法如下图,可以分为2个或3个步骤,步骤1组装参数对象,步骤2调用alipayService.getTradeNo方法,步骤3根据步骤2的返回内容做后续处理,最后返回阿里支付的交易编号。

7cef2d6b8579?utm_campaign=haruki&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

003

优化前代码的一些问题

对于上面图002中的getPayInfo方法,如果业务要在增加一种订单类型,那么就需要再增加一个case的同时,增加case中的步骤1,步骤2代码。这样的话就会导致每次增加一种新订单类型都需要维护很大的一大坨代码。而且如果某个现有订单类型的步骤1,步骤2逻辑需要改动,也需要在这个switch case里修改。如果用高大上的语言来描述,那就是没有符合开闭原则,没有做到单一职责原则,没有做到高内聚低耦合等等。

怎么来优化呢

上面的代码图002中service里的getPayInfo方法中, case里写了大量(省略了7个case分支)的重复代码,各个case中的步骤1,步骤2都是可以抽象出来的。

图002中case里调用各自的方法获取tradeNo。这些方法在图003中可以看出来也有共通性,也可以抽象出来。

从整体的代码逻辑上来看,图002中的每个case分支,及其后续操作,似乎都有着同样的共性,只有少部分的逻辑有各自的特性,那么很容易想到用模版方法模式来做优化。因为有很多case分支,也很容易联想到策略模式了。

优化的思路如下:

把不同的订单类型都当作不同的策略,那么也就是每一个case中的逻辑都是一个不同的策略;

因为每一个订单类型的代码流程大致都相同,只有少数不同的步骤,那么就定义一个模版类,将相同的步骤统一写在模版类里,不同的步骤,让策略类去继承模版类后,自己去实现;

把switch case转移到一个工厂类里,通过工厂类生成不同的策略对象;

外层代码调用工厂类返回对象的模版方法,即可完成订单支付流程。

优化之后的代码

首先创建一个模版类的接口IOrderAlipayStrategy,模版类实现这个接口,该接口只有一个方法payThroughAlipay,具体使用请看 2.

/**

* @Author: yesiming

* @Platform: Mac

* @Date: 5:14 下午 2020/9/25

*

* 代码优化:支付宝小程序支付优化成通过工厂,策略,模版 3种模式实现

* 此接口为:订单支付的策略接口

*/

public interface IOrderAlipayStrategy {

/**

* @param alipayConfig

* @param payType

* @param orderId

* @param alipayUserId

* @return

*

* 通过alipay支付,OrderInfo,包含阿里支付返回的TradeNo

*/

OrderInfo payThroughAlipay(AlipayConfig alipayConfig, PayType payType, String orderId, String alipayUserId) throws Exception;

}

OrderInfo用户存放模版方法返回的内容,代码如下。

public class OrderInfo {

private String payOrderId;

private BigDecimal totalAmount;

private String subject;

private String tradeNo;

public OrderInfo(BigDecimal totalAmount, String subject, PayType payType, String orderNo) {

this.payOrderId = String.join("-", payType.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值