自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:Mybatis里的設(shè)計模式有哪些?我一口氣答了8種

開發(fā) 前端
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。

[[358850]]

從2018年開始,我的簡歷上開始有一句很diao的話:

研究過Mybatis源碼

然后,每次面試都會被問到Mybatis里的設(shè)計模式。

面試官問:既然你研究過Mybatis源碼,哪里說說Mybatis用了哪些常見的設(shè)計模式?

我基本上都是把相關(guān)設(shè)計模式先回答一遍。

我:單量模式、代理模式、工廠模式、裝飾器模式.....劈哩吧啦的說上一堆設(shè)計模式。

面試官:能不能說說裝飾器模式在Mybatis中的什么場景中會用到?

我一般是先說什么是裝飾器模式,有什么好處,Mybatis中哪里用到了,這樣用什么好處。

接下來,面試官一般都是抓住其中兩三個問。

也為了防止老鐵們被問得更多,今天我就整理一番。

建造者設(shè)計模式

建造者模式(Builder Pattern)使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。

在Mybatis中有SqlSessionFactoryBuilder,構(gòu)建SqlSessionFactory, 這就是使用了建造者模式。

另外在Mybatis中類名以Builder結(jié)尾基本上都是建造者模式。下面是Mybatis中一個很完整的建造者模式:

XMLConfigBuilder :XML配置構(gòu)建器,建造者模式,繼承BaseBuilder 。

工廠模式

就是專門創(chuàng)建某某對象的工廠,你要什么對象,盡管開口,能創(chuàng)建的我來創(chuàng)建,你無需知道是怎么創(chuàng)建出來的。

在Mybatis中以Factory結(jié)尾的類,基本上都是使用了工廠模式。

生活中案例:很多外包公司,做銀行系統(tǒng),銀行只要把需求給他,給我做個什么什么系統(tǒng),外包公司拼了命的叫老鐵們加班,最后趕出來了。外包公司就是工廠,銀行就是客戶端??蛻舳瞬还苣闶窃趺锤愠鰜淼?,外包公司也不給銀行說。

比如說:

SqlSessionFactory:創(chuàng)建SqlSession對象。

ObjectFactory:對象工廠,所有對象都要由工廠來產(chǎn)生 。

MapperProxyFactory:創(chuàng)建映射器代理 MapperProxy對象。

單例模式

單例模式(Singleton Pattern)是 Java 中最簡單的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。這種模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

生活中案例:習大大就只能有一個,太陽只有一個,月亮只有一個。

org.apache.ibatis.logging.LogFactory,日志工廠類。

為什么是單例模式呢?情況下面代碼:

org.apache.ibatis.executor.ErrorContext,

代理模式

在代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式。

生活中的案例:房產(chǎn)中介、婚介所、黃牛黨等都是代理模式。

Mybatis實現(xiàn)的核心,比如MapperProxy為綁定我們開發(fā)的Mapper和Mapper.xml創(chuàng)建代理類、Plugin為每個插件創(chuàng)建一個代理類等。

Mybatis中尤其是動態(tài)代理使用的是相當?shù)亩?,建議大家,先學習代理模式,然后在學習動態(tài)代理(JDK和CGlib這兩種),如果想看Mybatis源碼,動態(tài)代理是必須掌握的。

適配器模式

適配器模式(Adapter Pattern)是作為兩個不兼容的接口之間的橋梁。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它結(jié)合了兩個獨立接口的功能。這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的接口功能。

在Mybatis中,Log,對于Log4j、JDK、longging這些沒有直接是想slf4j接口的日志組件,需要適配器。

模板方法模式

在模板模式(Template Pattern)中,一個抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進行。這種類型的設(shè)計模式屬于行為型模式。定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。

在Mybatis中,例如父類BaseExecutor,子類SimpleExecutor、BatchExecutor、ReuseExecutor。還有BaseTypeHandler和所有的子類例如IntegerTypeHandler;

基本都是在父類里實現(xiàn)一個通用的方法,然后創(chuàng)建一個抽象方法,這個抽象方法留給子類自己去實現(xiàn)。這個抽象方法也叫鉤子方法。

裝飾器模式

裝飾器模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個包裝。這種模式創(chuàng)建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。

實際開發(fā)中,大多數(shù)用于對老項目的某些功能進行擴展。新項目中一般不怎么用此模式。

生活中的案例:人靠衣裳馬靠鞍。美容照相機、沒有攝影機,美圖秀秀。

此設(shè)計模式重點在于對已有的功能進行擴展。

在Mybatis中,Cache的實現(xiàn)類LruCache、FifoCache等都是裝飾一個類PerpetualCache。常見代碼格式,就是裝飾類中會有個被裝飾類的屬性,并且這個屬性還是構(gòu)造方法的參數(shù)。

責任鏈模式

任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進行解耦。這種類型的設(shè)計模式屬于行為型模式。在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。

生活中的案例:

我們在OA系統(tǒng)發(fā)起一個審批,顯示項目經(jīng)理,再是部門經(jīng)理,再是HR,再是老板。

面試流程,顯示小組長面試里,項目經(jīng)理面試,部門經(jīng)理面試,HR面試。

在Mybatis中,InterceptorChain中有個屬性interceptors,其中就是保存了所有Mybatis的插件,執(zhí)行插件的時候就是遍歷這個interceptors。A插件->B插件->C插件....

總結(jié)

上面一共說了8種設(shè)計模式。其實在Mybatis中還有更多的設(shè)計模式,比如說組合模式、迭代器模式 等。

對于文中的8種設(shè)計模式,我建議一個優(yōu)先級,由高往低:

單例->工廠->模板方法->代理->裝飾器->責任鏈->適配器->建造者。

前面五個個人強烈推薦掌握。

本文轉(zhuǎn)載自微信公眾號「Java后端技術(shù)全?!?,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java后端技術(shù)全棧公眾號。

 

責任編輯:武曉燕 來源: Java后端技術(shù)全棧
相關(guān)推薦

2021-12-06 08:30:49

SpringSpring Bean面試題

2020-08-12 09:55:07

附近的人數(shù)據(jù)庫MySQL

2020-04-16 12:42:42

附近的人共享單車App

2020-05-08 10:08:21

延時隊列APIDelayQueue

2020-07-31 10:15:32

分布式ID數(shù)據(jù)庫MySQL

2020-11-04 14:20:58

分布式數(shù)據(jù)庫MySQL

2021-03-29 12:22:25

微信iOS蘋果

2021-06-08 22:43:07

IPC方式Qt

2020-04-14 13:32:56

@Transacti失效場景

2020-03-31 08:12:25

Kafka架構(gòu)數(shù)據(jù)庫

2022-05-24 11:50:46

延時消息分布式

2023-12-18 23:09:25

開源優(yōu)化引擎

2020-07-08 07:45:44

OAuth2.0授權(quán)

2024-01-29 00:29:49

通信技術(shù)行業(yè)

2020-10-22 12:30:33

MySQL

2020-09-24 09:08:04

分布式系統(tǒng)架構(gòu)

2024-03-26 09:42:27

分片算法應(yīng)用

2022-11-15 08:30:23

設(shè)計模式場景map

2021-05-18 09:03:16

Gomapslice

2020-07-10 07:44:26

Session方式Web
點贊
收藏

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