<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>

          敖丙的代碼,有點離譜

          共 2297字,需瀏覽 5分鐘

           ·

          2022-04-17 20:57

          我是3y,一年CRUD經(jīng)驗用十年的markdown程序員???????常年被譽為職業(yè)八股文選手。

          以前敖丙找過我看過幾次線上的問題,我看了他不少的代碼,還不錯,我偷師學了很多



          有不少的小伙伴都想要我來講講austin用到的設計模式,今天來簡單聊聊,這也是面試經(jīng)常會被問到的。

          設計模式這東西,說實話我也沒學全,一般我是遇到了相關(guān)的代碼再去學具體的設計模式。有了相關(guān)的設計模式的思想和應用場景,就多琢磨下自己的代碼能不能寫得更好,實踐一把。

          平時多留個心眼,覺得人家的代碼寫得有點秀,就想想是不是使用了設計模式。如果是的話,那就探討下該設計模式的應用場景看后面自己能不能用得上

          不多BB了,來吧。

          01、責任鏈模式

          我在「消息統(tǒng)一接入層」那里使用了責任鏈模式,用責任鏈模式的好處就是分工明確、解耦、易維護

          1、將多個條件判定分散到各個的處理類上,相對于if else耦合性相對較低。

          2、增加一個具體的Handler處理類,不會影響到BaseHandler的代碼

          責任鏈模式的缺點:

          1、項目里邊會有多個具體Handler類(因為每種處理都抽象為一個類,所以會有多個類)

          2、初看代碼時不太好閱讀(對外只是一個doChain方法,而里邊由多個處理類來組成,還得看相應的調(diào)用順序)

          責任鏈配置入口:com.java3y.austin.service.api.impl.config.PipelineConfig

          責任鏈處理入口:com.java3y.austin.service.api.impl.service.SendServiceImpl#send

          02、模板方法模式

          在austin項目代碼上用到模板方法的地方還是蠻多的,比較有代表性的就是去重的功能。老讀者可能都知道,我認為去重的功能的核心無非是唯一Key+存儲

          模板方法模式要點:

          1、把公共的代碼抽取出來,如果該功能是不確定的,那我們將其修飾成抽象方法。

          2、將幾個固定步驟的功能封裝到一個方法中,對外暴露這個方法,就可以非常方便調(diào)用了。

          模板方法模式優(yōu)點:封裝不變的部分,擴展可變的部分。把認為是不變的部分的算法封裝到父類,可變部分的交由子類來實現(xiàn)。

          模板方法模式缺點:抽象類定義了部分抽象方法,這些抽象的方法由子類來實現(xiàn),子類執(zhí)行的結(jié)果影響了父類的結(jié)果(子類對父類產(chǎn)生了影響),會帶來閱讀代碼的難度!

          我們在實際寫代碼的時候,一般存儲和和步驟都已經(jīng)確認下來了,唯一Key則可以由子類實現(xiàn)

          模板方法模式的代碼1:com.java3y.austin.handler.deduplication.service.AbstractDeduplicationService#deduplication

          模板方法模式的代碼2:com.java3y.austin.handler.handler.BaseHandler#doHandler

          03、構(gòu)建者模式

          建造者模式更多的是寫法上的不同,從代碼結(jié)構(gòu)層面上其實沒有很大的區(qū)別,只是看起來會更清爽一些。我借助了Lombok,在類上加上一個注解@Builder就可以使用建造者模式的代碼了,非常方便

          在austin里就隨處可見了,各種builder鏈式調(diào)用

          04、策略模式

          嚴格意義上的策略模式是基本沒什么人用的(策略模式有一個Context上下文對象),但如果我們說JDK線程池的設計也是策略模式

          那我可以認為的是:只要我們是面向接口編程的,那多多少少都有「策略模式」的影子

          所以,austin項目使用了策略模式還是有不少的

          策略模式代碼入口:com.java3y.austin.handler.pending.Task#run

          05、生產(chǎn)者消費者模式

          生產(chǎn)者消費者模式這種「設計模式」我還看到過在面試上讓手寫的,像JDK線程池的實現(xiàn)我認為就是典型的生產(chǎn)者和消費者模式(將消息丟入工作隊列,然后從工作隊列里消費)。

          我在實現(xiàn)延遲消費做批量的時候也實現(xiàn)了生產(chǎn)者和消費者模式,場景主要就是我讀取文件的每一行記錄,積攢到一定的程度才進行消費

          生產(chǎn)者入口:com.java3y.austin.cron.service.impl.TaskHandlerImpl#handle

          消費者入口:com.java3y.austin.support.pending.AbstractLazyPending#initConsumePending

          06、單例模式

          單例模式和代理模式幾乎都是依賴Spring環(huán)境下去玩的了,基本都不用手寫。

          在Spring下普通創(chuàng)建的對象默認都是單例模式,在項目里也有部分的對象是需要多例的。

          比如com.java3y.austin.handler.receiver.Receiver(不同的渠道不同的類型開不同的消費者組)和com.java3y.austin.cron.pending.CrowdBatchTaskPending(數(shù)據(jù)需各自維護,線程安全問題)

          07、代理模式

          代理模式在austin下倒是沒自己寫過,用的小組件幾乎都是基于代理模式去搞的。之前提及過的優(yōu)雅打印日志注解,只要你去看源碼,就一定會發(fā)現(xiàn)他們用的都是Spring的動態(tài)代理去實現(xiàn)的。

          看懂了,就說這組件是你自己優(yōu)化寫的

          后面austin更多的面試細節(jié),我會陸續(xù)繼續(xù)補充,歡迎點個star持續(xù)關(guān)注我的項目,不會讓你失望的

          http://gitee.com/zhongfucheng/austin

          目前還有我的個人微信還有少量名額可拉進austin項目交流群,想進來的添加我下方的二維碼,備注【項目】即可,拒絕內(nèi)鬼?????♀?

          閱讀原文可跳轉(zhuǎn)至Austin倉庫

          瀏覽 172
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧美日韩国产手机在线 | 黄色a一级直播 | 天天干天天干素人 | 亚洲秘 无码一区二区 | 成人AV麻豆 |