成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

2萬多行MyBatis源碼,你知道里面用了多少種設(shè)計模式嗎?

開發(fā) 前端
通過梳理,MyBatis大約運用了10種左右設(shè)計模式。可以說,復(fù)雜且優(yōu)秀的ORM 框架源碼在設(shè)計和實現(xiàn)的過程中都會使用大量的設(shè)計模式。

在MyBatis的兩萬多行的框架源碼中,使用了大量的設(shè)計模式對工程架構(gòu)中的復(fù)雜場景進行解耦,這些設(shè)計模式的巧妙使用是整個框架的精華。

經(jīng)過整理,大概有以下設(shè)計模式,如圖1所示。

圖片

圖1

01類型:創(chuàng)建型模式

▊ 工廠模式

SqlSessionFactory 的結(jié)構(gòu)如圖2所示。

圖片

圖2

工廠模式:簡單工廠是一種創(chuàng)建型模式,在父類中提供一個創(chuàng)建對象的方法,允許子類決定實例對象的類型。

場景介紹:SqlSessionFactory 是獲取會話的工廠,每次使用MyBatis 操作數(shù)據(jù)庫時, 都會開啟一個新的會話。在會話工廠的實現(xiàn)中,SqlSessionFactory 負責(zé)獲取數(shù)據(jù)源環(huán)境配置信息、構(gòu)建事務(wù)工廠和創(chuàng)建操作SQL 的執(zhí)行器,最終返回會話實現(xiàn)類。

同類設(shè)計:SqlSessionFactory、ObjectFactory、MapperProxyFactory 和DataSourceFactory。

▊ 單例模式

Configuration 單例配置類的結(jié)構(gòu)如圖3所示。

圖片

圖3

單例模式:是一種創(chuàng)建型模式,能夠保證一個類只有一個實例,并且提供一個訪問該實例的全局節(jié)點。

場景介紹:Configuration 是一個大單例,貫穿整個會話周期,所有的配置對象(如映射、緩存、入?yún)ⅰ⒊鰠ⅰr截器、注冊機和對象工廠等)都在Configuration 配置項中初始化, 并且隨著SqlSessionFactoryBuilder 構(gòu)建階段完成實例化操作。

同類場景:ErrorContext、LogFactory 和Configuration。

▊ 建造者模式

ResultMap 建造者模式的結(jié)構(gòu)如圖4所示。

圖片

圖4

建造者模式:使用多個簡單的對象一步一步地構(gòu)建成一個復(fù)雜的對象,提供了一種創(chuàng)建對象的最佳方式。

場景介紹:建造者模式在MyBatis 中使用了大量的XxxxBuilder,將XML 文件解析到各類對象的封裝中,使用建造者及建造者助手完成對象的封裝。它的核心目的是不希望把過多的關(guān)于對象的屬性設(shè)置寫到其他業(yè)務(wù)流程中,而是用建造者方式提供最佳的邊界隔離。

同類場景:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XML StatementBuilder 和CacheBuilder。

02類型:結(jié)構(gòu)型模式

▊ 適配器模式

日志實現(xiàn)類的結(jié)構(gòu)如圖5所示。

圖片

圖5

適配器模式:是一種結(jié)構(gòu)型模式,能使接口不兼容的對象也可以相互合作。

場景介紹:正是因為有太多的日志框架,包括Log4j、Log4j2 和Slf4J 等,而這些日志框架的使用接口又各有差異,為了統(tǒng)一這些日志框架的接口,MyBatis 定義了一套統(tǒng)一的接口,為所有的其他日志框架的接口做相應(yīng)的適配。

同類場景:主要集中在對Log 日志的適配上。

▊ 代理模式

代理模式的實現(xiàn)結(jié)構(gòu)如圖6所示。

圖片

圖6

代理模式:是一種結(jié)構(gòu)型模式,能夠提供對象的替代品或占位符。代理控制元對象的訪問,并且允許在將請求提交給對象前進行一些處理。

場景介紹:沒有代理模式就不存在各類框架。就像MyBatis 中的MapperProxy 實現(xiàn)類, 代理工廠實現(xiàn)的功能就是完成DAO 接口的具體實現(xiàn)類的方法,配置的任何一個DAO 接口調(diào)用的CRUD 方法,都會被MapperProxy 接管,調(diào)用到方法執(zhí)行器等,并返回最終的數(shù)據(jù)庫執(zhí)行結(jié)果。

同類場景:DriverProxy、Plugin、Invoker 和MapperProxy。

▊ 組合模式

解析節(jié)點類的結(jié)構(gòu)如圖7所示。

圖片

圖7

組合模式:是一種結(jié)構(gòu)型模式,可以將對象組合成樹形結(jié)構(gòu)以表示“部分—整體” 的層次結(jié)構(gòu)。

場景介紹:在MyBatis XML 動態(tài)的SQL 配置中,共提供了9 種標(biāo)簽(trim、where、set、foreach、if、choose、when、otherwise 和bind),使用者可以組合出各類場景的SQL 語句。而SqlNode 接口的實現(xiàn)就是每個組合結(jié)構(gòu)中的規(guī)則節(jié)點,通過規(guī)則節(jié)點的組裝,完成規(guī)則樹組合模式的使用。

同類場景:主要體現(xiàn)在對各類SQL 標(biāo)簽的解析上,以實現(xiàn)SqlNode 接口的各個子類為主。

▊ 裝飾器模式

二級緩存裝飾器的實現(xiàn)結(jié)構(gòu)如圖8所示。

圖片

圖8

裝飾器模式:是一種結(jié)構(gòu)型設(shè)計模式,允許將對象放入包含行為的特殊封裝對象中, 為元對象綁定新的行為。

場景介紹:MyBatis 的所有SQL 操作都是經(jīng)過SqlSession 調(diào)用SimpleExecutor 完成的, 而一級緩存的操作也是在簡單執(zhí)行器中處理的。這里的二級緩存因為是基于一級緩存刷新的,所以在實現(xiàn)上,通過創(chuàng)建一個緩存執(zhí)行器,包裝簡單執(zhí)行器的處理邏輯,實現(xiàn)二級緩存操作。這里用到的就是裝飾器模式,也叫俄羅斯套娃模式。

03類型:行為型模式

▊ 模板模式

SQL 執(zhí)行模板模式如圖9所示。

圖片

圖9

模板模式:是一種行為型模式,在超類中定義了一個算法的框架,允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟。場景介紹:存在一系列可被標(biāo)準(zhǔn)定義的流程,并且流程的步驟大部分采用通用邏輯,只有一小部分是需要子類實現(xiàn)的,通常采用模板模式來定義這個標(biāo)準(zhǔn)的流程。就像MyBatis 的BaseExecutor 就是一個用于定義模板模式的抽象類,在這個類中把查詢、修改的操作都定義為一套標(biāo)準(zhǔn)的流程。

同類場景:BaseExecutor、SimpleExecutor 和BaseTypeHandler。

▊ 策略模式

多類型處理器策略模式的結(jié)構(gòu)如圖10所示。

圖片

圖10

策略模式:是一種行為型模式,能定義一系列算法,并將每種算法分別放入獨立的類中,從而使算法的對象能夠互相替換。

場景介紹:在MyBatis 處理JDBC 執(zhí)行后返回的結(jié)果時,需要按照不同的類型獲取對應(yīng)的值,這樣就可以避免大量的if 判斷。所以,這里基于TypeHandler 接口對每個參數(shù)類型分別做了自己的策略實現(xiàn)。

同類場景:PooledDataSource、UnpooledDataSource、BatchExecutor、ResuseExecutor、SimpleExector、CachingExecutor、LongTypeHandler、StringTypeHandler 和DateTypeHandler。

▊ 迭代器模式

拆解字段解析實現(xiàn)的結(jié)構(gòu)如圖11所示。

圖片

圖11

迭代器模式:是一種行為型模式,能在不暴露集合底層表現(xiàn)形式的情況下遍歷集合中的所有元素。

場景介紹:PropertyTokenizer 用于MyBatis 的MetaObject 反射工具包下,用來解析對象關(guān)系的迭代操作。這個類在MyBatis 中使用得非常頻繁,包括解析數(shù)據(jù)源配置信息并填充到數(shù)據(jù)源類上,同時參數(shù)的解析、對象的設(shè)置都會使用這個類。

同類場景:PropertyTokenizer。

04總結(jié)

通過梳理,MyBatis大約運用了10種左右設(shè)計模式。可以說,復(fù)雜且優(yōu)秀的ORM 框架源碼在設(shè)計和實現(xiàn)的過程中都會使用大量的設(shè)計模式。

在解決復(fù)雜場景的問題時,需要采用分治、抽象的方法,運用設(shè)計模式和設(shè)計原則等相關(guān)知識,把問題合理切割為若干子問題,以便加以理解和解決。

學(xué)習(xí)源碼遠不是只是為了應(yīng)付面試,更重要的是學(xué)習(xí)優(yōu)秀框架在復(fù)雜場景下的解決方案。通過學(xué)習(xí)這些優(yōu)秀的方案技術(shù),可以提高對技術(shù)設(shè)計和實現(xiàn)的理解,擴展編碼思維,積累落地經(jīng)驗。只有經(jīng)過這樣長期的積累,我們才更有可能成為優(yōu)秀的高級工程師和架構(gòu)師。

本文轉(zhuǎn)載自微信公眾號「江南一點雨」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系江南一點雨公眾號。

責(zé)任編輯:武曉燕 來源: 江南一點雨
相關(guān)推薦

2018-01-31 10:24:45

熱插拔原理服務(wù)器

2019-12-02 10:16:46

架構(gòu)設(shè)計模式

2022-08-11 08:46:23

索引數(shù)據(jù)結(jié)構(gòu)

2024-05-27 00:01:00

2020-11-18 08:15:39

TypeScript設(shè)計模式

2019-11-07 11:49:14

架構(gòu)運維技術(shù)

2025-03-21 10:33:22

2024-11-26 14:29:48

2018-07-04 11:02:23

無線傳輸模式

2021-08-11 10:00:51

緩存MyBatis管理

2024-03-20 00:04:46

TypeScriptas const類型斷言

2019-02-12 11:15:15

Spring設(shè)計模式Java

2024-07-03 08:33:08

2019-07-04 05:22:02

物聯(lián)網(wǎng)設(shè)備物聯(lián)網(wǎng)IOT

2020-01-02 15:43:29

Spring設(shè)計策略

2022-12-01 08:09:05

SQLOracleSPM

2017-08-23 18:31:28

華為

2015-11-02 09:50:48

電腦1秒鐘事情

2023-02-02 14:24:08

物聯(lián)網(wǎng)數(shù)據(jù)分析云平臺

2020-09-11 06:39:29

ThreadLocal線程
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品自拍 | 国产精品免费在线 | 日韩精品成人在线 | 国产激情精品 | 国产精品久久久久免费 | 亚洲精彩视频 | 欧美一区二区 | 一区二区国产在线观看 | 在线视频亚洲 | 伊人啪啪网 | 国产在线精品一区二区三区 | 中文字幕一区二区三区日韩精品 | av福利网| 另类一区 | 中文字幕男人的天堂 | 成人影院av| 99re视频在线观看 | 色狠狠一区 | 欧美aaaaaaaa| 亚洲天堂中文字幕 | 久久亚洲国产 | 99色在线| 国产精品一区二区视频 | 日日干夜夜操 | 中文在线a在线 | 99亚洲 | 欧美一区二区三区大片 | 午夜精品一区二区三区在线观看 | 亚洲图片一区二区三区 | 日韩在线一区二区 | 国产精品久久久久久久久大全 | 91精品无人区卡一卡二卡三 | 亚洲国产精品久久久 | 亚洲一区二区三区福利 | 精品一区二区久久久久久久网精 | 欧美精品一区二区蜜桃 | 精品日本中文字幕 | 亚洲欧洲中文日韩 | 国产精品成人av | 日本精品视频在线 | 在线欧美亚洲 |