中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用web設計模式中的模板方法

發布時間:2021-11-16 11:27:24 來源:億速云 閱讀:136 作者:iii 欄目:大數據

本篇內容介紹了“怎么使用web設計模式中的模板方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

什么是模版方法模式

模板方法模式

1.定義了一個操作中的算法的骨架,而將部分步驟的實現在子類中完成。
模板方法模式使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
2.模板方法模式是所有模式中最為常見的幾個模式之一,是基于繼承的代碼復用的基本技術,沒有關聯關系。 因此,在模板方法模式的類結構圖中,只有繼承關系。

核心設計要點

AbstractClass : 抽象類,定義并實現一個模板方法。這個模板方法定義了算法的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類去實現
ConcreteClass : 實現實現父類所定義的一個或多個抽象方法。

模版方法應用場景

  1. 比如聚合支付平臺中系統回調代碼重構

  2. Servlet請求

模板方法的代碼實現

模板方法抽象類

@Slf4j
@Component
public abstract class AbstractPayCallbackTemplate {
    /**
     * 異步回調業務
     *
     * @return
     */
    public String asyncCallBack() {
        // 1. 支付回調驗證參數
        Map<String, String> verifySignatureMap = verifySignature();
        // 2. 參數驗證成功,寫入日志中..
        payLog(verifySignatureMap);
        String analysisCode = verifySignatureMap.get("analysisCode");
        if (!analysisCode.equals("200")) {
            return resultFail();
        }
        // 3. 執行回調異步相關邏輯
        return asyncService(verifySignatureMap);

    }


    /**
     * 支付回調驗證參數
     *
     * @return
     */
    protected abstract Map<String, String> verifySignature();

    /**
     * 使用多線程異步寫入日志
     *
     * @param verifySignatureMap
     */
    @Async
    private void payLog(Map<String, String> verifySignatureMap) {
        log.info(">>>>>>>>>>第二步 寫入payLog........");
    }

    /**
     * 每個子類需要實現 實現業務解析操作
     *
     * @return
     */
    protected abstract String asyncService(Map<String, String> verifySignatureMap);

    /**
     * 異步返回結果..
     *
     * @return
     */
    protected abstract String resultSuccess();

    /**
     * 異步返回失敗
     *
     * @return
     */
    protected abstract String resultFail();
}

具體實現模板

  1. AliPayCallbackTemplate

@Slf4j
@Component
public class AliPayCallbackTemplate extends AbstractPayCallbackTemplate {
    @Override
    protected Map<String, String> verifySignature() {
        //>>>>假設一下為支付寶回調報文>>>>>>>>>>>>>>>>
        log.info(">>>>>第一步 解析支付寶據報文.....verifySignature()");
        Map<String, String> verifySignature = new HashMap<>();
        verifySignature.put("price", "1399");
        verifySignature.put("orderDes", "充值螞蟻課堂永久會員");
        // 支付狀態為1表示為成功....
        verifySignature.put("aliPayMentStatus", "1");
        verifySignature.put("aliPayOrderNumber", "201910101011");
        // 解析報文是否成功 200 為成功..
        verifySignature.put("analysisCode", "200");
        return verifySignature;

    }

    @Override
    protected String asyncService(Map<String, String> verifySignatureMap) {
        log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap);
        String paymentStatus = verifySignatureMap.get("aliPayMentStatus");
        if (paymentStatus.equals("1")) {
            String aliPayOrderNumber = verifySignatureMap.get("aliPayOrderNumber");
            log.info(">>>>orderNumber:{aliPayOrderNumber},已經支付成功 修改訂單狀態為已經支付...");
        }
        return resultSuccess();

    }

    @Override
    protected String resultSuccess() {
        return "ok";
    }

    @Override
    protected String resultFail() {
        return null;
    }
  1. UnionPayCallbackTemplate

@Slf4j
@Component
public class UnionPayCallbackTemplate extends AbstractPayCallbackTemplate {
    @Override
    protected Map<String, String> verifySignature() {
        //>>>>假設一下為銀聯回調報文>>>>>>>>>>>>>>>>
        log.info(">>>>>第一步 解析銀聯數據報文.....verifySignature()");
        Map<String, String> verifySignature = new HashMap<>();
        verifySignature.put("price", "1399");
        verifySignature.put("orderDes", "充值螞蟻課堂永久會員");
        // 支付狀態為1表示為成功....
        verifySignature.put("paymentStatus", "1");
        verifySignature.put("orderNumber", "201910101011");
        // 解析報文是否成功 200 為成功..
        verifySignature.put("analysisCode", "200");
        return verifySignature;

    }

    @Override
    protected String asyncService(Map<String, String> verifySignatureMap) {
        log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap);
        String paymentStatus = verifySignatureMap.get("paymentStatus");
        if (paymentStatus.equals("1")) {
            String orderNumber = verifySignatureMap.get("orderNumber");
            log.info(">>>>orderNumber:{orderNumber},已經支付成功 修改訂單狀態為已經支付...");
        }
        return resultSuccess();

    }

    @Override
    protected String resultSuccess() {
        return "success";
    }

    @Override
    protected String resultFail() {
        return null;
    }
}

工廠模式獲取模板

@Component
public class TemplateFactory {
    public static AbstractPayCallbackTemplate getPayCallbackTemplate(String templateId) {
        AbstractPayCallbackTemplate payCallbackTemplate = (AbstractPayCallbackTemplate) SpringUtils.getBean(templateId);
        return payCallbackTemplate;
    }
}

controller

@RestController
public class TemplateController {
    @RequestMapping("/asyncCallBack")
    public String asyncCallBack(String templateId) {
        AbstractPayCallbackTemplate payCallbackTemplate = TemplateFactory.getPayCallbackTemplate(templateId);
        return payCallbackTemplate.asyncCallBack();
    }
}

控制臺輸出結果

>>>>>第一步 解析支付寶據報文.....verifySignature()
>>>>>>>>>>第二步 寫入payLog........
>>>>>第三步asyncService()verifySignatureMap:{aliPayOrderNumber=201910101011, orderDes=充值螞蟻課堂永久會員, price=1399, analysisCode=200, aliPayMentStatus=1}
>>>>orderNumber:{aliPayOrderNumber},已經支付成功 修改訂單狀態為已經支付...
1.)優點
模板方法模式通過把不變的行為搬移到超類,去除了子類中的重復代碼。子類實現算法的某些細節,有助于算法的擴展。通過一個父類調用子類實現的操作,通過子類擴展增加新的行為,符合“開放-封閉原則”。
2.)缺點
每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。
3.)適用場景
在某些類的算法中,用了相同的方法,造成代碼的重復。控制子類擴展,子類必須遵守算法規則。

“怎么使用web設計模式中的模板方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

web
AI

安吉县| 桑植县| 万宁市| 衡山县| 耒阳市| 无为县| 东港市| 那曲县| 龙岩市| 介休市| 永善县| 栾城县| 芜湖县| 凭祥市| 百色市| 泽库县| 无极县| 海淀区| 黄山市| 黎川县| 石城县| 巴林左旗| 昌乐县| 巴南区| 册亨县| 韶山市| 同江市| 孟村| 金阳县| 栾川县| 正蓝旗| 平利县| 七台河市| 宜川县| 东乡县| 南木林县| 辽阳县| 万源市| 兴化市| 盐亭县| 堆龙德庆县|