<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖解設(shè)計模式:身份認(rèn)證場景的應(yīng)用

          共 2827字,需瀏覽 6分鐘

           ·

          2022-02-14 22:45

          今天和大家聊一聊,如何合理的將多種設(shè)計模式放到同一個業(yè)務(wù)場景中

          業(yè)務(wù)背景

          最近接到一個認(rèn)證的需求,C 端用戶在購買公司保險時,需要先進(jìn)行 實(shí)名認(rèn)證確認(rèn)身份

          為了保證?業(yè)務(wù)復(fù)用,單獨(dú)將認(rèn)證的邏輯拆分為微服務(wù)模塊

          C 端用戶下單購買保險的邏輯大致如下

          先說下關(guān)于認(rèn)證相關(guān)的一些基本知識。簡單來說,你如何證明你是你自己

          一些云服務(wù)廠商都會有關(guān)于驗(yàn)證身份的付費(fèi)接口,接下來我們就以騰訊云姓名、身份證二要素認(rèn)證為參考進(jìn)行舉例

          說完認(rèn)證知識,我們再來拆解下用戶購買保險的步驟

          1. 用戶在前端發(fā)起認(rèn)證行為
          2. 請求經(jīng)過網(wǎng)關(guān)調(diào)用保險服務(wù),保險服務(wù)調(diào)用認(rèn)證服務(wù)
          3. 認(rèn)證服務(wù)調(diào)用騰訊云認(rèn)證付費(fèi) API,返回認(rèn)證結(jié)果信息

          認(rèn)證流程

          在整個塊認(rèn)證流程中,我們會講解三種設(shè)計模式,按照順序分別是策略、責(zé)任鏈、模板模式

          策略模式

          定義一組算法類,將每個算法分別封裝起來,讓它們可以互相替換。策略模式使這些算法在客戶端調(diào)用它們的時候能夠互不影響地變化,客戶端代指使用算法的代碼

          我們拿認(rèn)證來說,定義一個認(rèn)證接口,然后實(shí)現(xiàn)二、三、四要素以及人臉識別實(shí)現(xiàn);將這些實(shí)現(xiàn)類放到一個 Map 容器中,并和業(yè)務(wù)規(guī)定好對應(yīng)的標(biāo)識 Key,通過標(biāo)識 Key 獲取對應(yīng)的認(rèn)證策略實(shí)現(xiàn)

          如果真的像上面這么簡單,if-else 判斷加上拆解幾個認(rèn)證函數(shù)就可以搞得定,還真的不一定需要策略模式

          我們再延伸來看一種復(fù)雜場景:假設(shè)后續(xù)不滿足于騰訊云的認(rèn)證,為了保證可用性以及更多的流量,需要對接更多的認(rèn)證平臺

          可用性:平臺的接口不太可能保證全年百分百可用,需要有容災(zāi)降級或者替換方案

          更多的流量:騰訊云認(rèn)證接口限流 100次 / S

          這個時候策略模式的優(yōu)點(diǎn)就體現(xiàn)出來了,簡化代碼的復(fù)雜性 以及 保證開閉原則,增加程序的健壯性以及可擴(kuò)展性

          后續(xù)再增加三方認(rèn)證平臺和認(rèn)證方式,都不需要改動原有邏輯,添加對應(yīng)實(shí)現(xiàn)即可

          責(zé)任鏈模式

          在責(zé)任鏈模式中,多個處理器(參照攔截器)依次處理同一個請求。一個請求先經(jīng)過 A 處理器處理,然后再把請求傳遞給 B 處理器,B 處理器處理完后再傳遞給 C 處理器,以此類推,形成一個鏈條,鏈條上的每個處理器 各自承擔(dān)各自的處理職責(zé)

          這里主要將責(zé)任鏈模式應(yīng)用于,規(guī)避無意義調(diào)用三方認(rèn)證服務(wù)

          1. 已認(rèn)證過的人員信息,在有效期內(nèi)沒必要再次調(diào)用
          2. 調(diào)用認(rèn)證結(jié)果錯誤,依然會扣錢,比如說名稱中包含非中文,身份證格式錯誤等等

          我們可以將處理器盡量職責(zé)單一,方便后續(xù)其它認(rèn)證方式的 復(fù)用和編排

          模板方法

          模板方法模式在一個方法中定義一個 算法骨架,并將某些步驟推遲到 子類中實(shí)現(xiàn)。模板方法模式可以讓子類在 不改變算法整體結(jié)構(gòu)的情況下,重新定義算法中的某些步驟

          模版方法主要作用:復(fù)用性擴(kuò)展性

          • 復(fù)用性:核心思想就是 父級定義公共實(shí)現(xiàn),由子級進(jìn)行調(diào)取使用
          • 擴(kuò)展性:在不修改方法邏輯的前提下,變更其中的某些步驟

          通俗來講 : 定義一個抽象類 AbstractTemplate,并定義一個或若干抽象方法 abstractMethod。代碼大致如下:

          public?abstract?class?AbstractAuthenticationService<T?extends?AuthenticationRequest>?{

          ????void?before(T?request)?{
          ????}

          ????void?after(T?request)?{
          ????}

          ???//?抽象方法
          ????protected?abstract?void?practicalExecute(T?request);

          ????public?void?authentication(T?request)?{
          ???????//?前置攔截操作,包括不限于責(zé)任鏈模式調(diào)用
          ????????before(request);
          ???????//?策略模式實(shí)現(xiàn),調(diào)用具體認(rèn)證類,比如二要素認(rèn)證或三要素認(rèn)證
          ????????practicalExecute(request);
          ???????//?資源清理或記錄認(rèn)證完成信息
          ????????after(request);
          ????}

          騰訊云二要素認(rèn)證實(shí)現(xiàn)類,代碼如下:

          @Slf4j
          @Component
          @RequiredArgsConstructor
          //?BaseAuthenticationStrategy?是策略模式實(shí)現(xiàn),定義了?mark、execute?方法
          public?class?NameIdCardAuthenticationByTencentResolver?extends?AbstractAuthenticationService<NameIdCardAuthenticationReqDTO>
          ????????implements?BaseAuthenticationStrategy<NameIdCardAuthenticationReqDTO>?
          {

          ????private?static?final?String?SUCCESS?=?"0";

          ???//?責(zé)任鏈容器
          ????private?final?NameIdCardHandlerChain?nameIdCardHandlerChain;

          ????@Override
          ????public?String?mark()?{
          ????????return?AuthenticationEnum.TENCENT.name();
          ????}

          ????@Override
          ????public?void?execute(NameIdCardAuthenticationReqDTO?request)?{
          ????????authentication(request);
          ????}

          ????@Override
          ????public?void?before(NameIdCardAuthenticationReqDTO?request)?{
          ???????//?責(zé)任鏈調(diào)用
          ????????nameIdCardHandlerChain.doFilter(request);
          ????}

          ????@Override
          ????public?void?practicalExecute(NameIdCardAuthenticationReqDTO?request)?{
          ????????//?騰訊云二要素認(rèn)證具體行為
          ????}

          }

          最后總結(jié)

          拋出一個老生常談的問題,學(xué)習(xí)設(shè)計模式有什么作用?

          設(shè)計模式主要是為了應(yīng)對 代碼的復(fù)雜性,讓其滿足 開閉原則,提高代碼的 擴(kuò)展性;合適的場景合理運(yùn)用的設(shè)計模式,可以幫助代碼實(shí)現(xiàn) 高內(nèi)聚、低耦合 等的優(yōu)點(diǎn)

          你無法決定別人的代碼,但你可以決定自己的。時間充足的情況下,盡量以重構(gòu)的方式去寫每一行代碼

          因?yàn)槠鶈栴},沒有大張旗鼓講設(shè)計模式本身,提供大家一個學(xué)習(xí)鏈接:https://github.com/acmenlt/framework

          最后希望小伙伴讀過文章后有所收獲,祝好。

          ?? 半年時間寫個開源框架?

          瀏覽 75
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲.无码.变态.欧美.中文 | 日韩高清无码专区 | 激情综合五月 | 人人草人人摸 | 91人妻人人操人人爽 |