設(shè)計模式雜談

關(guān)于設(shè)計的個人看法

我們設(shè)計一個功能的時候,要考慮的無非是那些問題:可靠性,魯棒性,解耦性,擴展性,可讀性等等。

我們對代碼和功能的設(shè)計過程,從面相對象的角度來講就是一個擬物或者擬人化的一個過程——我們先確定某個功能需要什么樣的角色或者“零部件”參與,然后創(chuàng)建對應的類,指定類的角色職能;然后各個類各司其職;然后再考慮類的擴展性相關(guān)的問題,做出優(yōu)化。

設(shè)計功能的第一步當然是明確需求,但是功能落地的重要過程我認為就是擬物擬人化的這個過程。

設(shè)計案例分析

現(xiàn)在我們有個需求,異步模塊——將要執(zhí)行的數(shù)據(jù)放到后臺異步去執(zhí)行,使用場景有數(shù)據(jù)導入導出,數(shù)據(jù)庫間數(shù)據(jù)同步等。

現(xiàn)在我們進行擬物擬人化的過程(角色劃分)我將這個功能劃分成一下幾個角色

  • 任務 指要處理的數(shù)據(jù)等
  • 資源 這里單指線程池
  • 任務處理器 處理任務的具體邏輯。
  • 管理器 負責調(diào)度線程,安排任務,將任務分發(fā)給各個處理器

功能設(shè)計到這,這個框架只能滿足使用要求,通用性不強;就是說,能用但是比較垃圾。為什么這么說,

首先,我們?nèi)蝿諔撘允裁礃拥男问将@???又以什么樣的形式去發(fā)布一個一個任務?框架中未做說明,也沒有角色來干這個事情,所以我們要在管理器中定義一個命令模式,這個命令就是任務,命令方法就是發(fā)布任務,再在其內(nèi)部使用模板方法模式固定一些算法。再添加一個任務工廠來獲取和管理任務。

然后任務處理器這一端,任務處理邏輯肯定是使用者自己實現(xiàn)的,因此要具有適配性,這個適配性的支持,可以通過接口也可以通過注解,這都無所謂,所以我們還要添加一個任務處理器適配器。

最后框架就成了這個樣子:

  • 任務(命令)
  • 任務工廠
  • 任務處理器
  • 任務處理器適配器
  • 管理器
  • 資源(線程池)

OK,實話告訴你吧,這個框架和 springmvc 的原理是一個意思:request 對應任務、 dispatchServlet對應的是管理者,Maphandler 對應的是處理器適配器,controller對應任務處理器, 任務工廠充當一個前端用戶角色發(fā)送一個個請求。我這里多了個命令發(fā)送方的角色讓管理器充當了,你也可以在添加一個命令發(fā)送器類。這個異步框架流程就如下:

  1. 調(diào)用命令發(fā)送器發(fā)送一個命令(任務); 命令發(fā)送器根據(jù)具體實現(xiàn)來決定這個命令是應該放入到內(nèi)存中還是放入到數(shù)據(jù)庫里還是直接執(zhí)行。
  2. 任務工廠從數(shù)據(jù)庫,或者內(nèi)存或者別的什么地方讀取出任務,排根據(jù)任務優(yōu)先級序任務,然后將任務交給管理器。
  3. 管理器根據(jù)任務類型匹配到對應的任務處理器,交給任務處理器去處理

任務處理器的實現(xiàn)就像springmvc那樣,我們可以定義一個處理器接口,然后所有實現(xiàn)該接口的并注入到spring容器的對象都是處理器。也可以定義一個像@requestMaoing那樣的注解,所有加上該注解的方法都會被適配成一個處理,實現(xiàn)起來也很容易。為了方便使用,我們還可以再對任務加一個監(jiān)聽器,我們想發(fā)布任務的時候只要拋出一個事件即可,當然這只是附帶功能,非必須的功能。

關(guān)于代碼可讀性的思考

一個好的設(shè)計模式還好說,一個使用糟糕的設(shè)計模式簡直是災難,作者就經(jīng)歷過這種災難:設(shè)計模式用的莫名其妙,不暗2套路來,命名也無跡可尋,這樣的代碼可讀性就很差。因為設(shè)計模式之間類關(guān)系本身就很復雜,在少一點注釋,真的很難去讀懂。那么我們要怎么讓一段代碼能讓別人讀懂呢?第一就是加注釋,第二就是命名規(guī)范。下面我們就來說說設(shè)計模式的命名規(guī)范吧。

基本的一些命名:

  • 模板方法模式的類一般以 template 結(jié)尾
  • 工廠模式一般以 factory 結(jié)尾
  • 代理模式一般以 proxy 結(jié)尾,代理方法一般命名為invoke()
  • 執(zhí)行命令的方法一般叫execute() ,命令類一般以 Command 結(jié)尾
  • 觀察者模式中,監(jiān)聽器一般以listener 結(jié)尾
  • 建造者一般以 builder 結(jié)尾
  • 適配器 Adapter 結(jié)尾

一些常用的“擬物” 結(jié)尾名詞

  • 處理器/執(zhí)行器

    Resolver
    Processor
    Handler
    Executor
    Performer
    Runner
    
  • 管理器控制器

    Controller
    Manager
    Ordinator
    Leader
    Master
    
  • 轉(zhuǎn)換器

    Encoder/Decoder
    Transformer
    Converter
    
  • 映射器
Mapper/Mapping
  • 選擇器
Chooser
Selector

小結(jié)

對于許多源碼而言,設(shè)計模式都是雜糅在一起的,許多類你不能片面的劃為哪一個設(shè)計模式,它可能在許多模式里面都充當著角色。我們閱讀源碼的時候要有通過命名去猜設(shè)計模式能力;同時我們也要有一定的聯(lián)想能力,能夠在實戰(zhàn)中聯(lián)想到相關(guān)源碼,要學會 “抄作業(yè)” 。

點擊關(guān)注我的博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容