一個(gè)支付案例,學(xué)會(huì)策略模式!
博客:https://blog.csdn.net/qq_30285985/
前言
在開(kāi)發(fā)時(shí),總會(huì)遇到支付的需求,但是支付的方式有很多,支付寶支付,微信支付,銀行卡支付,每種支付方式的接口不一樣,參數(shù)信息也不一樣,一般情況下,會(huì)有很多if/else來(lái)進(jìn)行判斷,但是業(yè)務(wù)邏輯的逐漸增多,if/else顯得那么的沉重,通過(guò)策略模式即可更優(yōu)雅的來(lái)處理這種代碼。
什么是策略模式呢?比如一個(gè)人要從廣州去北京,這個(gè)人可以選擇乘坐飛機(jī)去,也可以選擇乘坐火車去。兩種交通方式的選擇,可以認(rèn)為是兩種策略。映射到程序中,可以認(rèn)為是兩種算法,比如支付的時(shí)候,選擇支付寶支付或者微信支付。
策略模式的特點(diǎn)是不管過(guò)程怎么樣,結(jié)果都是一樣的。不管乘坐飛機(jī)還是火車,最后都會(huì)到達(dá)北京;不管哪種支付方式,最終都會(huì)支付成功。過(guò)程不一樣,結(jié)果都一樣。
一、支付案例
1.普通代碼
代碼如下(示例):
@PostMapping("/makeOrder")
public ResultData makeOrder(@RequestBody Order order){
// 生成自己的訂單,并且設(shè)置訂單的失效時(shí)間,并且定時(shí)回滾
// ... 此處代碼省略
// 處理支付方式
if(order.getType=="alipay"){ // 支付寶
this.payService.alipay(order);
}else if (order.getType=="weixin"){ // 微信
this.payService.weixinpay(order);
}else if (order.getType=="jd"){ // 京東支付
this.payService.jtpay(order);
}else if (order.getType=="yunshanfu"){ // 云閃付
this.payService.yunshanfupay(order);
}
// 發(fā)送到mq,進(jìn)行廣播。
return this.ok(order);
}
相信代碼肯定會(huì)很多,而且if/else來(lái)處理會(huì)顯得代碼很雜亂。或者有通過(guò)增加接口來(lái)減少if/else
@PostMapping("/alipay")
public ResultData makeOrder(@RequestBody Order order){
}
@PostMapping("/jdpay")
public ResultData makeOrder(@RequestBody Order order){
}
現(xiàn)在邏輯少,代碼不會(huì)顯得雜亂,如果有很多種支付方式呢?代碼會(huì)顯得很雜亂,而且擴(kuò)展受限。
2.引入策略模式
代碼如下(入口):
private OrderService orderService;
@PostMapping("/makeOrder")
// 商品id
// 支付類型
public ResultData makeOrder(Long goodsId,String type){
// 生成本地的訂單
Order order = this.orderService.makeOrder(goodsId);
//選擇支付方式
PayType payType = PayType.getByCode(type);
//進(jìn)行支付
payType.get().pay(order.getId(),order.getAmount());
return this.ok();
}
代碼如下(支付方式):
public enum PayType {
//支付寶 AliPay 是實(shí)現(xiàn)類
ALI_PAY("1",new AliPay()),
//微信
WECHAT_PAY("2",new WechatPay());
private String payType;
// 這是一個(gè)接口
private Payment payment;
PayType(String payType,Payment payment){
this.payment = payment;
this.payType = payType;
}
//通過(guò)get方法獲取支付方式
public Payment get(){ return this.payment;}
public static PayType getByCode(String payType) {
for (PayType e : PayType.values()) {
if (e.payType.equals(payType)) {
return e;
}
}
return null;
}
}
代碼如下(支付接口):
public interface Payment {
public void pay(Long order, double amount);
}
代碼如下(支付寶支付實(shí)現(xiàn)):
public class AliPay implements Payment {
@Override
public void pay(Long order, double amount) {
System.out.println("----支付寶支付----");
System.out.println("支付寶支付111元");
}
}
代碼如下(微信支付實(shí)現(xiàn)):
public class WechatPay implements Payment {
@Override
public void pay(Long orderId, double amount) {
System.out.println("---微信支付---");
System.out.println("支付222元");
}
}
通過(guò)枚舉來(lái)優(yōu)雅的選擇支付類型,共用一個(gè)支付接口,不同的支付方式實(shí)現(xiàn)自己的邏輯,更加貼合面向?qū)ο蟮乃枷搿_@種方式相對(duì)與if/else更加優(yōu)雅。
關(guān)注微信公眾號(hào):互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的教程,都是干貨。
1、GitHub 標(biāo)星 3.2w!史上最全技術(shù)人員面試手冊(cè)!FackBoo發(fā)起和總結(jié)
3、從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧
5、37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...
6、滴滴業(yè)務(wù)中臺(tái)構(gòu)建實(shí)踐,首次曝光
