java学习基地

微信扫一扫 分享朋友圈

已有 1246 人浏览分享

一个支付案例,学会策略模式!

[复制链接]
1246 0
本帖最初由 渭耶java 于 2021-3-18 09:09 编纂

正在开辟时,总会碰到付出的需供,可是付出的方法有许多,付出宝付出,微疑付出,银止卡付出,每种付出方法的接心纷歧样,参数疑息也纷歧样,普通状况下,会有许多if/else去停止判定,可是营业逻辑的逐步增加,if/else隐得那末的繁重,经由过程战略形式便可更文雅的去处置这类代码。

甚么是战略形式呢?好比一小我私家要从广州来北京,那小我私家能够挑选逞砒飞机来,也能够挑选逞砒水车来。两种交通方法狄住择,能够以为是两种战略。映照到法式中,能够以为是两种算法,好比付出的时分,挑选付出宝付出大概微疑付出。

战略形式的特性是不论历程怎样,成果皆是一样的。不论逞砒飞机仍是水车,最初城市抵达北京;不论哪一种付出方法,终极城市付出胜利。历程纷歧样,成果皆一样。

1、付出案例

付出时,会有许多参数,许多逻辑,常常会碰到一种付出方法,上百止的代码,并且借需求很好的把控事件。假如多种付出方法,代码颐挥嗅成倍的上涨。保护起去相称难熬痛苦。

1.一般代码

代码以下(示例):

  1. @PostMapping("/makeOrder")
  2.     public ResultData makeOrder(@RequestBody  Order order){
  3.         // 天生本人的定单,而且设置定单的生效工夫,而且按时回滚
  4.         //  ... 此处代码省略
  5.         // 处置付出方法
  6.         if(order.getType=="alipay"){ // 付出宝
  7.             this.payService.alipay(order);
  8.         }else if (order.getType=="weixin"){ // 微疑
  9.             this.payService.weixinpay(order);
  10.         }else if (order.getType=="jd"){ // 京东付出
  11.             this.payService.jtpay(order);
  12.         }else if (order.getType=="yunshanfu"){ // 云闪付
  13.             this.payService.yunshanfupay(order);
  14.         }
  15.         // 收收到mq,停止播送。
  16.         return this.ok(order);
  17.     }
赶钙代码
信赖代码必定会许多,并且if/else去处置会隐得代码很混乱。大概有经由过程增长接心去削减if/else
  1. @PostMapping("/alipay")
  2.     public ResultData makeOrder(@RequestBody  Order order){
  3.     }
  4.     @PostMapping("/jdpay")
  5.     public ResultData makeOrder(@RequestBody  Order order){
  6.     }
赶钙代码

如今逻辑少,代码没有会隐得混乱,假如有许多种付出方法呢?代码会隐得很混乱,并且扩大受限。

2.引进战略形式

代码以下(进口):

  1. private OrderService orderService;
  2.     @PostMapping("/makeOrder")
  3.     // 商品id
  4.     // 付出范例
  5.     public ResultData makeOrder(Long goodsId,String type){
  6.         // 天生当地的定单
  7.         Order order = this.orderService.makeOrder(goodsId);
  8.         //挑选付出方法
  9.         PayType payType = PayType.getByCode(type);
  10.         //停止付出
  11.         payType.get().pay(order.getId(),order.getAmount());
  12.         return this.ok();
  13.     }
赶钙代码

代码以下(付出方法):

  1. public enum PayType {
  2.     //付出宝        AliPay 是完成类
  3.     ALI_PAY("1",new AliPay()),
  4.     //微疑
  5.     WECHAT_PAY("2",new WechatPay());
  6.     private String payType;
  7.     // 那是一个接心
  8.     private Payment payment;
  9.     PayType(String payType,Payment payment){
  10.         this.payment = payment;
  11.         this.payType = payType;
  12.     }
  13.     //经由过程get办法获得付出方法
  14.     public Payment get(){ return  this.payment;}
  15.     public static PayType getByCode(String payType) {
  16.         for (PayType e : PayType.values()) {
  17.             if (e.payType.equals(payType)) {
  18.                 return e;
  19.             }
  20.         }
  21.         return null;
  22.     }
  23. }
赶钙代码

代码以下(付出接心):

  1. public interface Payment {
  2.     public void pay(Long order, double amount);
  3. }
赶钙代码

代码以下(付出宝付出完成):

  1. public class AliPay implements Payment {
  2.     @Override
  3.     public void pay(Long order, double amount) {
  4.         System.out.println("----付出宝付出----");
  5.         System.out.println("付出宝付出111元");
  6.     }
  7. }
赶钙代码

代码以下(微疑付出完成):

  1. public class WechatPay implements Payment {
  2.     @Override
  3.     public void pay(Long orderId, double amount) {
  4.         System.out.println("---微疑付出---");
  5.         System.out.println("付出222元");
  6.     }
  7. }
赶钙代码

经由过程列举去文雅狄住择付出范例,共用一个付出接心,差别的付出方法完成本人的逻辑,愈加揭开里背工具的思惟。这类方法相洞侩if/else愈加文雅。

可是,实在如许一看,哇,利用战略形式,创立了很多多少类,好费事狄座子,仍是利用if/else代码少一面,可是久远来讲,付出的逻辑必然是扑朔迷离,经由过程战略形式能够愈加友爱的停止扩大。


可是if/else停止扩大,代码会比力冗余,假如原来便出几止代码,缺强迫利用战略形式,偶然是弄巧成拙。



举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

1

粉丝

307

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-4-11 05:09 , Processed in 0.518522 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.