日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

不得不說(shuō),在很多業(yè)務(wù)中,這種模式用得真的很香

來(lái)源: 責(zé)編: 時(shí)間:2024-04-26 17:36:06 225觀看
導(dǎo)讀老貓的設(shè)計(jì)模式專欄已經(jīng)偷偷發(fā)車了。不甘愿做crud boy?看了好幾遍的設(shè)計(jì)模式還記不住?那就不要刻意記了,跟上老貓的步伐,在一個(gè)個(gè)有趣的職場(chǎng)故事中領(lǐng)悟設(shè)計(jì)模式的精髓吧。還等什么?趕緊上車吧。故事“不能再寫if else來(lái)拓

老貓的設(shè)計(jì)模式專欄已經(jīng)偷偷發(fā)車了。不甘愿做crud boy?看了好幾遍的設(shè)計(jì)模式還記不住?那就不要刻意記了,跟上老貓的步伐,在一個(gè)個(gè)有趣的職場(chǎng)故事中領(lǐng)悟設(shè)計(jì)模式的精髓吧。還等什么?趕緊上車吧。i7c28資訊網(wǎng)——每日最新資訊28at.com

故事

“不能再寫if else來(lái)拓展當(dāng)前系統(tǒng)了,現(xiàn)在已經(jīng)有三個(gè)支付場(chǎng)景了......”工位上,小貓看著電腦,撓著頭。i7c28資訊網(wǎng)——每日最新資訊28at.com

就在剛剛,小貓接到了一個(gè)新需求,需要和客戶公司打通資產(chǎn),形成資產(chǎn)聯(lián)動(dòng)。說(shuō)白了就是需要定制化對(duì)接客戶公司的支付資產(chǎn)體系。除了這次接到的之外。前面其實(shí)已經(jīng)對(duì)接了三家了。由于每家對(duì)接規(guī)范都不一樣,歷史對(duì)接的時(shí)候?yàn)榱吮M快上線,都是直接搞個(gè)else的新路由分支,然后去實(shí)現(xiàn)支付,退款。i7c28資訊網(wǎng)——每日最新資訊28at.com

在小貓看來(lái),就是在堆屎山。牽一發(fā)而動(dòng)全身的感覺(jué)真的很不好。由于本次的需求留有的時(shí)間還是相當(dāng)充裕的,所以小貓下定決心,打算利用這次的拓展,將原來(lái)不合理的地方用上設(shè)計(jì)模式將其重構(gòu)掉。i7c28資訊網(wǎng)——每日最新資訊28at.com

深思熟慮很久,小貓下定決心打算用“策略模式”重構(gòu)一番。i7c28資訊網(wǎng)——每日最新資訊28at.com

聊聊策略模式

說(shuō)到策略模式,老貓覺(jué)得這種設(shè)計(jì)模式在實(shí)際開發(fā)中使用其實(shí)是相當(dāng)頻繁的。老貓工作到現(xiàn)在也在很多業(yè)務(wù)場(chǎng)景中使用過(guò)這樣的設(shè)計(jì)模式。例如,上述小貓遇到的第三方支付集成的問(wèn)題上。另外的還有商城搞活動(dòng),針對(duì)不同的用戶下單行為提供不同的折扣或者返現(xiàn)等活動(dòng)。再例如商城運(yùn)營(yíng)人員根據(jù)不同的加價(jià)策略去定在售商品的價(jià)格等。i7c28資訊網(wǎng)——每日最新資訊28at.com

老貓工作十年中,對(duì)接過(guò)很多外部企業(yè)或者單位的接口,若業(yè)務(wù)定義一樣,只是接口協(xié)議不同的業(yè)務(wù)其實(shí)往往都可以用到策略模式。提煉一下適用場(chǎng)景如下:i7c28資訊網(wǎng)——每日最新資訊28at.com

(1)系統(tǒng)中有很多類,而它們的區(qū)別僅僅在于行為不同。i7c28資訊網(wǎng)——每日最新資訊28at.com

(2)一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。i7c28資訊網(wǎng)——每日最新資訊28at.com

在很多業(yè)務(wù)中,這種模式用起來(lái)真的很香,既能夠擺脫成堆的“if else”(當(dāng)然關(guān)于 if else的優(yōu)化,又是另外一個(gè)故事了,有興趣的小伙伴可以看看這篇文章【接手了個(gè)項(xiàng)目,被if..else搞懵逼了】),另外寫出來(lái)的代碼本身拓展性也會(huì)比較好。i7c28資訊網(wǎng)——每日最新資訊28at.com

那么我們來(lái)看看策略模式,并且基于小貓遇到的場(chǎng)景問(wèn)題,咱們來(lái)擼一下實(shí)現(xiàn)代碼。i7c28資訊網(wǎng)——每日最新資訊28at.com

策略模式解決多路支付通道問(wèn)題

在定義支付行為的時(shí)候,我們首先定義出常規(guī)的支付行為,咱們可以用接口interface的形式定義出來(lái),當(dāng)然也可以用abstract類的方式定義出來(lái)。這里老貓使用后者來(lái)定義。代碼如下:i7c28資訊網(wǎng)——每日最新資訊28at.com

/** * @author 公眾號(hào):程序員老貓 */public abstract class Payment {    //獲取支付渠道的名稱    public abstract String getName();    //查詢用戶余額    protected abstract BigDecimal queryBalance(String uid);    public PayState doPay(String uid, BigDecimal amount) {        if (queryBalance(uid).compareTo(amount) < 0) {            return new PayState(500, "支付失敗", "賬戶余額不足");        }        return new PayState(200, "支付成功", "支付金額:" + amount);    }}

定義一個(gè)標(biāo)準(zhǔn)的支付狀態(tài)類:i7c28資訊網(wǎng)——每日最新資訊28at.com

/** * @author 公眾號(hào):程序員老貓 */public class PayState {    private int code;    private String msg;    private Object data;    public PayState(int code, String msg, Object data) {        this.code = code;        this.msg = msg;        this.data = data;    }    public String toString() {        return ("pay state :[" + code + "]," + msg + ",order detail: " + data);    }}

接下來(lái),咱們來(lái)模擬各個(gè)支付渠道,并且咱們能夠知道在不同的支付渠道中,我們當(dāng)前的賬戶余額是多少。咱們就拿用得比較多的微信、支付寶、京東支付等支付渠道來(lái)做模擬吧。i7c28資訊網(wǎng)——每日最新資訊28at.com

支付寶實(shí)現(xiàn),并且賬戶中有900元:i7c28資訊網(wǎng)——每日最新資訊28at.com

public class AliPay extends Payment {    @Override    public String getName() {        return "支付寶";    }    @Override    protected BigDecimal queryBalance(String uid) {        return new BigDecimal(900);    }}

微信支付,并且賬戶中有300元:i7c28資訊網(wǎng)——每日最新資訊28at.com

public class WxPay extends Payment{    @Override    public String getName() {        return "微信";    }    @Override    protected BigDecimal queryBalance(String uid) {        return new BigDecimal(300);    }}

以此類推,京東支付。i7c28資訊網(wǎng)——每日最新資訊28at.com

public class JDPay extends Payment{    @Override    public String getName() {        return "京東白條";    }    @Override    protected BigDecimal queryBalance(String uid) {        return new BigDecimal(400);    }}

定義好各種單一支付通道之后,其實(shí)我們就要組裝策略了。把上述支付通道,加載到策略路由類中。老貓覺(jué)得這個(gè)地方也是策略模式中比較核心的點(diǎn)。i7c28資訊網(wǎng)——每日最新資訊28at.com

/** * @author 公眾號(hào):程序員老貓 */public class PayStrategy {    public static final String ALI_PAY = "aliPay";    public static final String WX_PAY = "wxPay";    public static final String JD_PAY = "jdPay";    public static final String DEFAULT = "wxPay";    //初始化的時(shí)候裝載支付行為策略    private static Map<String,Payment> paymentMap = new HashMap<>();    static {        paymentMap.put(ALI_PAY,new AliPay());        paymentMap.put(WX_PAY,new WxPay());        paymentMap.put(JD_PAY,new JDPay());        paymentMap.put(DEFAULT,new WxPay());    }    //調(diào)用的時(shí)候路由具體的支付策略    public static Payment get(String payKey){        if(!paymentMap.containsKey(payKey)){            return paymentMap.get(DEFAULT);        }        return paymentMap.get(payKey);    }}

接下來(lái),我們就模擬用戶下訂單支付行為了,具體如下:i7c28資訊網(wǎng)——每日最新資訊28at.com

/** * @author 程序員老貓 * 下單場(chǎng)景 */public class Order {    private String uid; //用戶Id    private String orderId; //訂單Id    private BigDecimal orderAmount; //支付金額    public Order(String uid, String orderId, BigDecimal orderAmount) {        this.uid = uid;        this.orderId = orderId;        this.orderAmount = orderAmount;    }    public PayState doPay() {        return doPay(PayStrategy.DEFAULT);    }    public PayState doPay(String payKey) {        Payment payment = PayStrategy.get(payKey);        System.out.println("歡迎使用" + payment.getName());        System.out.println("本次交易金額:" + orderAmount);        return payment.doPay(uid, orderAmount);    }}

最終咱們來(lái)進(jìn)行測(cè)試一下:i7c28資訊網(wǎng)——每日最新資訊28at.com

public class PayStrategyTest {    public static void main(String[] args) {        Order order = new Order("ktdaddy","20240425224901",new BigDecimal(245));        System.out.println(order.doPay(PayStrategy.ALI_PAY));    }}

結(jié)果輸出:i7c28資訊網(wǎng)——每日最新資訊28at.com

歡迎使用支付寶本次交易金額:245pay state :[200],支付成功,order detail: 支付金額:245

上述基本就是策略模式的使用了。老貓覺(jué)得應(yīng)該還是比較清晰的。咱們簡(jiǎn)單看一下最終的調(diào)用類圖:i7c28資訊網(wǎng)——每日最新資訊28at.com

策略模式類圖策略模式類圖i7c28資訊網(wǎng)——每日最新資訊28at.com

到這里很多小伙伴可能會(huì)問(wèn)了,上面寫的案例其實(shí)并沒(méi)有結(jié)合我們實(shí)際的spring開發(fā)框架去實(shí)現(xiàn)策略模式,日常開發(fā)的過(guò)程中我們Java程序員主要用的還是spring框架。那么如果要結(jié)合咱們spring日常開發(fā)框架又是怎么去實(shí)現(xiàn)呢。那么接下來(lái),咱們接著往下看。i7c28資訊網(wǎng)——每日最新資訊28at.com

SpringBoot下策略模式解決多路支付通道

其實(shí)核心的思想還是上面這幾個(gè)要領(lǐng),老貓?jiān)诖瞬欢嘧稣归_,只是給大家提供一些思路,然后提供一些簡(jiǎn)單的日常開發(fā)中使用的截圖給大家參考。支付使用策略模式的核心的思想無(wú)非就下面兩個(gè)。i7c28資訊網(wǎng)——每日最新資訊28at.com

(1)咱們需要不同的支付策略類。i7c28資訊網(wǎng)——每日最新資訊28at.com

(2)需要有路由支付策略類的路由類。i7c28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)上面兩個(gè)核心中,比較重要的還是第二點(diǎn),咱們?nèi)绻コ跏蓟呗灶悺T谏厦姘咐校县埵褂玫撵o態(tài)方法塊來(lái)裝載各個(gè)策略方法。在spring中其實(shí)我們可以使用@PostConstruct注解,進(jìn)行service策略的初始化裝載。i7c28資訊網(wǎng)——每日最新資訊28at.com

如下首先定義一個(gè)標(biāo)準(zhǔn)的支付接口,并且實(shí)現(xiàn)一下:i7c28資訊網(wǎng)——每日最新資訊28at.com

public interface Payment {    //獲取支付渠道的名稱    String getCode();    PayState doPay(String uid, BigDecimal amount);}

然后實(shí)現(xiàn)這個(gè)接口,咱們舉一個(gè)例子來(lái)說(shuō)明i7c28資訊網(wǎng)——每日最新資訊28at.com

@Servicepublic class JDPay implements Payment {    @Override    public String getCode() {        return "jdPay";    }    @Override    public PayState doPay(String uid, BigDecimal amount) {        return null;    }}

關(guān)鍵此時(shí)咱們看一下核心加載的地方。i7c28資訊網(wǎng)——每日最新資訊28at.com

/** * 程序員老貓 **/@Servicepublic class PayStrategy {    @Autowired    private Payment[] payments;    //初始化的時(shí)候裝載支付行為策略    private static Map<String, Payment> paymentMap = new ConcurrentHashMap<>();    @PostConstruct    private void initRouteMap() {        for (Payment externalPayService : payments) {            paymentMap.put(externalPayService.getCode(), externalPayService);        }    }    public Payment getPayment(String payCode) {        return paymentMap.get(payCode);    }}

上述就是結(jié)合spring的核心策略模式的實(shí)現(xiàn)方式,老貓這里沒(méi)有展開,但是最精華的部分,老貓覺(jué)得已經(jīng)說(shuō)清楚了。當(dāng)然基于@PostConstruct進(jìn)行策略加載的方式只是一種。大家可以實(shí)現(xiàn)spring自帶的InitializingBean,在 Spring 容器完成 bean 的屬性注入后,會(huì)調(diào)用 afterPropertiesSet() 方法來(lái)執(zhí)行初始化邏輯。i7c28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

上述主要和大家分享了基于策略模式如何去做支付整合第三方支付的問(wèn)題。當(dāng)然這只是一個(gè)簡(jiǎn)單的案例,其實(shí)很多時(shí)候我們?cè)趯?shí)際的業(yè)務(wù)開發(fā)中很多地方都可以用到這樣一個(gè)模式。在jdk源碼中以及spring源碼中也屢見不鮮。但是策略模式也不是萬(wàn)能的,存在優(yōu)點(diǎn)的同時(shí)也存在缺點(diǎn)。i7c28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)點(diǎn):i7c28資訊網(wǎng)——每日最新資訊28at.com

1、策略模式符合開閉原則。(當(dāng)然有興趣了解設(shè)計(jì)原則的小伙伴歡迎戳【違反這些設(shè)計(jì)原則,系統(tǒng)就等著“腐爛”】)i7c28資訊網(wǎng)——每日最新資訊28at.com

2、策略模式可以避免使用多重復(fù)的條件語(yǔ)句。例如優(yōu)化if else。之前老貓也寫過(guò)類似博文。【接手了個(gè)項(xiàng)目,被if..else搞懵逼了】i7c28資訊網(wǎng)——每日最新資訊28at.com

3、使用策略模式可以提高算法的保密性和安全性。i7c28資訊網(wǎng)——每日最新資訊28at.com

缺點(diǎn):i7c28資訊網(wǎng)——每日最新資訊28at.com

1、不像適配器模式,策略模式要求客戶端需要知道所有的策略,并且自行決定使用哪類策略。關(guān)于適配器模式,感興趣的小伙伴可以看這里【真香定律!我用這種模式重構(gòu)了第三方登錄】i7c28資訊網(wǎng)——每日最新資訊28at.com

2、策略類會(huì)越來(lái)越多,維護(hù)成本也會(huì)越來(lái)越高。i7c28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-85877-0.html不得不說(shuō),在很多業(yè)務(wù)中,這種模式用得真的很香

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: WPF開發(fā):使用命令模式實(shí)現(xiàn)Undo和Redo功能

下一篇: 消息稱英偉達(dá)收購(gòu)以色列高效 AI 模型企業(yè) Deci,后者曾拿下 7B 量級(jí)模型第一

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
狠狠干综合网| 欧美日韩伦理在线| 亚洲一区二区精品| 亚洲欧美久久| 久久久久久久久岛国免费| 老司机一区二区三区| 欧美激情视频一区二区三区不卡| 欧美日产国产成人免费图片| 国产精品久久久久久久免费软件 | 欧美色中文字幕| 国产精品网站视频| 亚洲国产99| 亚洲素人在线| 久久夜色精品亚洲噜噜国产mv| 欧美精品国产一区二区| 国产精品综合久久久| 亚洲国产小视频| 香蕉久久精品日日躁夜夜躁| 欧美v亚洲v综合ⅴ国产v| 国产精品99一区| 黄色成人片子| 一区二区三区四区五区在线| 久久精品91久久香蕉加勒比| 欧美激情视频在线免费观看 欧美视频免费一 | 国产精品户外野外| 在线电影欧美日韩一区二区私密| 亚洲美女淫视频| 久久成人18免费观看| 欧美伦理91i| 韩国欧美一区| 亚洲一级在线| 欧美国产日本高清在线| 国产视频一区在线观看| 99av国产精品欲麻豆| 久久裸体艺术| 国产精品视频一| 亚洲精品综合精品自拍| 国产欧美在线| 亚洲另类自拍| 久久在线免费观看| 国产乱人伦精品一区二区| 亚洲毛片视频| 乱中年女人伦av一区二区| 国产精品视频99| 99在线精品视频在线观看| 久热综合在线亚洲精品| 国产一区白浆| 亚洲欧美成人在线| 欧美日韩一区二区三区在线视频| 亚洲黄色成人| 久久视频在线免费观看| 国产亚洲aⅴaaaaaa毛片| 亚洲一区二区精品| 欧美日韩一区二区在线视频 | 亚洲图片激情小说| 欧美激情欧美激情在线五月| 影音先锋久久精品| 久久av资源网站| 国产精品拍天天在线| 一区二区三区四区五区视频| 欧美精品在线免费播放| 91久久黄色| 麻豆精品在线观看| 一区二区在线观看av| 久久国产精品99国产精| 国产女精品视频网站免费 | 亚洲特级片在线| 欧美日韩aaaaa| 亚洲乱码久久| 欧美日韩xxxxx| 亚洲精品一二三区| 欧美成人国产一区二区| 亚洲国产精品欧美一二99| 久久婷婷激情| 极品少妇一区二区三区| 久久久亚洲国产天美传媒修理工 | 国产精品欧美经典| 亚洲一区二区三区中文字幕| 国产精品爱久久久久久久| 亚洲社区在线观看| 国产精品v日韩精品v欧美精品网站| 一卡二卡3卡四卡高清精品视频| 欧美激情一区三区| 日韩亚洲欧美中文三级| 欧美日韩一卡二卡| 一区二区三区视频观看| 国产精品高潮呻吟久久av黑人| 亚洲午夜影视影院在线观看| 国产精品久久久久久超碰 | 欧美日本一区二区高清播放视频| 亚洲日韩欧美视频| 欧美日本国产| 亚洲一区二区三| 国产裸体写真av一区二区| 欧美一区二区视频在线| 韩日欧美一区| 欧美成年人视频网站欧美| 亚洲毛片av在线| 国产精品爱啪在线线免费观看| 亚洲一区免费在线观看| 国产热re99久久6国产精品| 久久国产手机看片| 亚洲国产91| 欧美视频一区二区三区在线观看| 亚洲在线观看免费视频| 国产一区成人| 欧美成人高清| 中文精品视频| 国产亚洲综合精品| 欧美不卡高清| 亚洲一级影院| 黄色成人精品网站| 欧美精品在线免费播放| 亚洲欧美日韩一区| 精品动漫一区二区| 欧美激情片在线观看| 亚洲自拍偷拍色片视频| 伊人久久成人| 欧美日韩国产成人在线免费| 亚洲自拍16p| 激情婷婷亚洲| 欧美日韩亚洲一区二区三区在线观看| 亚洲欧美日韩一区二区在线| 一区二区视频欧美| 欧美日韩国产欧| 欧美亚洲三区| 亚洲品质自拍| 国产精品亚洲人在线观看| 久久一二三区| 亚洲天堂久久| 狠狠色综合日日| 欧美日韩在线综合| 久久久久久国产精品mv| 一本色道久久综合亚洲91| 国产亚洲成av人在线观看导航| 欧美成人午夜影院| 午夜精品剧场| 亚洲精品在线视频| 国产亚洲欧美日韩一区二区| 欧美精品免费在线| 欧美专区福利在线| 一区二区三区偷拍| 精品99一区二区三区| 欧美午夜一区二区| 免播放器亚洲| 香蕉尹人综合在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品青草久久| 欧美精品免费观看二区| 久久精品麻豆| 亚洲一区二区三区乱码aⅴ| 亚洲电影欧美电影有声小说| 国产精品毛片高清在线完整版| 免费观看日韩av| 欧美一区二区免费观在线| av成人老司机| 在线视频观看日韩| 国产日韩精品在线观看| 欧美日韩精品一区| 老司机精品导航| 国产一区二区三区在线观看视频 | 国产视频久久| 欧美四级电影网站| 欧美成人午夜激情视频| 久久久久欧美精品| 亚洲字幕一区二区| av成人激情| 91久久精品国产91久久性色| 国产一区99| 国产精品丝袜白浆摸在线| 欧美精品一区三区在线观看| 久久―日本道色综合久久| 性色av一区二区三区红粉影视| 亚洲视频一区在线观看| 亚洲精品午夜| 亚洲清纯自拍| 亚洲电影免费在线| 激情综合激情| 国产主播在线一区| 国产视频在线观看一区二区| 国产精品美女久久| 国产精品扒开腿做爽爽爽视频| 欧美另类视频| 欧美激情国产高清| 欧美暴力喷水在线| 免费成人性网站| 美国十次成人| 久久久视频精品| 久久精品国产综合精品| 欧美一级片久久久久久久| 亚洲午夜性刺激影院| 亚洲一级在线观看| 亚洲午夜电影在线观看| 亚洲视频综合| 亚洲图中文字幕| 亚洲视频专区在线| 亚洲一区二区高清| 亚洲在线播放| 午夜精品999| 性欧美xxxx大乳国产app| 午夜视频精品| 久久大香伊蕉在人线观看热2| 欧美专区日韩视频| 久久久久久久激情视频|