創(chuàng)建模式
單例模式
什么是設(shè)計模式
- 設(shè)計模式:一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)耙旦。
- 目的:可重用代碼,讓代碼更容易被他人理解悬荣、保證代碼可靠性骑冗。
- Java中的設(shè)計模式:23種:
- [x] 創(chuàng)建型模式:工廠方法模式、抽象工廠模式隆豹、單例模式椭岩、建造者模式、原型模式璃赡;
- [x] 結(jié)構(gòu)型模式:適配器模式判哥、裝飾器模式、代理模式碉考、外觀模式塌计、橋接模式、組合模式侯谁、享元模式锌仅;
- [x] 行為型模式:策略模式、模板方法模式墙贱、觀察者模式热芹、迭代子模式、責任鏈模式惨撇、命令模式伊脓、備忘錄模式、狀態(tài)模式魁衙、訪問者模式报腔、中介者模式、解釋器模式纺棺;
- [x] 其它模式:并發(fā)型模式和線程池模式榄笙。
單例模式:保證整個應用中某個實例有且只有一個。
舉例:配置文件祷蝌、工具類、線程池、緩存米丘、日志對象等
單利模式實現(xiàn)
- 應用場合: 有些對象只需要一個就足夠了.
- 作用: 保證整個應用程序中某個實例有且只有一個.
(1) 餓漢式
懶漢模式剑令,先只是進行聲明,當存在該實例的時候直接返回拄查,不存在的時候再去新建
/*
* 單例模式Singleton
* 應用場合:有些對象只需要一個就足夠了吁津,如古代皇帝、老婆
* 作用:保證整個應用程序中某個實例有且只有一個
* 類型:餓漢模式堕扶、懶漢模式
*/
public class Singleton {
//1.將構(gòu)造方法私有化典尾,不允許外部直接創(chuàng)建對象
private Singleton(){
}
//2.創(chuàng)建類的唯一實例,使用private static修飾
private static Singleton instance=new Singleton();
//3.提供一個用于獲取實例的方法弃酌,使用public static修飾
public static Singleton getInstance(){
return instance;
}
}
(2) 懶漢式
餓漢模式特點之一就是在類加載是這個類的實例就被加載了楣责,無論之后是否用到這個實例
/*
* 懶漢模式
*/
public class Singleton2 {
//1.將構(gòu)造方法私有化屯烦,不允許外邊直接創(chuàng)建對象
private Singleton2(){
}
//2.聲明類的唯一實例,使用private static修飾
private static Singleton2 instance;
//3.提供一個用于獲取實例的方法懈词,使用public static修飾
public static Singleton2 getInstance(){
if(instance == null){
instance = new Singleton2();
}
return instance;
}
}
餓漢式、懶漢式區(qū)別
餓漢模式:在加載類的時候就加載了實例荧嵌,因此加載慢愉择,但運行快破花,線程安全
懶漢模式:在加載類時沒有加載實例嫡纠,加載快延赌,運行時加載實例除盏,運行慢,線程不安全
工廠模式
工廠模式的概念挫以、意圖者蠕、應用場景、動機
-
工廠模式的概念
-
工廠模式的意圖
-
工廠模式的應用場景
-
工廠模式的動機
-
工廠模式類圖
-
抽象工廠模式類圖
工廠模式的應用
-
常見的應用
(1) JDBC的工作流程
(2) spring beanfactory
-
對比:
-
實現(xiàn)了
-
適用場景
結(jié)構(gòu)型模式
代理模式
1. 概念
- [x] 為其他對象提供一種代理掐松,以控制對這個對象的訪問(例如火車站代售處)踱侣。代理對象起到中介作用,可去掉功能服務或增加額外的服務大磺。
2. 代理模式的分類:
- [ ] 遠程代理模式: 為不同地理的對象提供局域網(wǎng)代表對象(例子:通過遠程代理可以監(jiān)控各個店鋪抡句,使之可以直觀的了解店里的情況)
- [ ] 虛擬代理: 根據(jù)需要將資源消耗很大的對象進行延遲,真正需要的時候進行創(chuàng)建
- [ ] 保護代理: 控制用戶的訪問權(quán)限
- [ ] 智能引用代理: 提供對目標對象提供額外的服務(火車票代售處)
智能引用代理:
靜態(tài)代理
- 靜態(tài)代理:代理和被代理對象在【代理之前】都是【確定】的杠愧。他們都實現(xiàn)【相同的接口或者繼承相同的抽象類】
- 代理實現(xiàn)方法:
(1)繼承法:代理類直接【繼承】被代理類待榔,實現(xiàn)其原有方法,并添加一些額外功能
(2)聚合方法:代理類實現(xiàn)【相同的功能接口:很重要流济,事項相同接口锐锣,不同代理也可以進行相互代理】盔几,并在內(nèi)聲明一個被代理類的對象(類似封裝)光督,通過內(nèi)部對象實現(xiàn)其原有方法,并添加額外功能
3身笤、靜態(tài)代理的實現(xiàn)
(1)聚合代理優(yōu)于繼承代理糖声。因為實現(xiàn)功能疊加的情況下橘茉,聚合代理通過相互代理可以實現(xiàn)功能重用,而繼承代理必須寫多個類來實現(xiàn)多功能疊加姨丈。
(2)靜態(tài)代理只能代理一種類型的被代理類,換個類型的就不行了擅腰,這需要動態(tài)代理
4蟋恬、靜態(tài)代理的兩種實現(xiàn)方式對比(繼承方式和聚合方式)
案例--代理類功能的疊加
(1) 繼承的方式:如果使用繼承的方式來實現(xiàn)我們代理功能的疊加,我們的代理類會無限的膨脹下去趁冈。
(2) 聚合的方式:由于代理類和被代理類都實現(xiàn)了相同的接口歼争,那么代理類的構(gòu)造參數(shù)就可以傳入該相同的接口拜马,這樣在后面功能疊加的時候就可以傳入其他功能的代理類,因為他們都實現(xiàn)了相同的父接口沐绒。從而達到功能疊加的作用俩莽。
動態(tài)代理
- JDK動態(tài)代理
(1) 目的:動態(tài)產(chǎn)生代理,實現(xiàn)對【不同類】乔遮,【不同方法】的代理
(2) java動態(tài)代理類扮超,位于java.lang.reflect包下,一般涉及兩個類:
(1)Interface InvocationHandler:該接口中僅定義了一個方法public object invoke(Object obj,Method method,Object[] args)
參數(shù):
obj:被代理類的對象
method:被代理的方法
args:被代理方法參數(shù)數(shù)組
返回值:
Object:方法返回值
(2)Proxy:該類即為動態(tài)代理類:
static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
參數(shù):
loader:被代理類的類加載器蹋肮,通過被代理類.getClass().getClassLoader()得到
interfaces:實現(xiàn)的接口出刷,通過getClass().getInterfaces()得到
h:invocationHandler
返回值:
返回代理類的一個實例
- 動態(tài)代理實現(xiàn)步驟:
(1)創(chuàng)建一個實現(xiàn)接口InvocationHandler的類,它必須實現(xiàn)invoke方法坯辩。
(2)創(chuàng)建被代理的類以及接口馁龟。
(3)調(diào)用Proxy的靜態(tài)方法,創(chuàng)建一個代理類漆魔。
newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
(4)通過代理調(diào)用方法坷檩。
CGLIB動態(tài)代理
-
JDK動態(tài)代理與CGLIB動態(tài)代理之間的區(qū)別
- CGLIB:是一個強大的開源項目,可以在運行期擴展Java類與實現(xiàn)Java接口
- JDK動態(tài)代理實現(xiàn)思路
實現(xiàn)功能:通過Proxy的newProxyInstance返回代理對象
(1)聲明一段源碼(動態(tài)產(chǎn)生代理)
(2)編譯源碼(JDK Compiler API)改抡,產(chǎn)生新的類(代理類)
(3)將這個類load到內(nèi)存當中矢炼,產(chǎn)生一個新的對象(代理對象)
(4)return 代理對象
3. 總結(jié)
1、代理概念雀摘、分類及應用場景
為其他對象設(shè)置總代理裸删,以控制對這個對象的訪問;
代理對象起到了中介的作用阵赠,去掉了某些功能涯塔,或增加了些額外的服務。
四類:
Remote Proxy -- 客戶端服務器的模式
Virtual Proxy -- 資源消耗很大清蚀,或復雜的對象匕荸,需要延遲,需要時創(chuàng)建枷邪,
Protect Proxy -- 保護和控制權(quán)限
Smart Reference Proxy -- 提供額外服務榛搔。
為什么只講智能引用代理?
使用得多:日志處理东揣、權(quán)限管理践惑、事務處理...
靜態(tài)代理(繼承嘶卧、聚合)
JDK動態(tài)代理實現(xiàn)日志處理的功能
模擬JDK動態(tài)代理實現(xiàn):在代理類Proxy和被代理類RealSubject之間,加入了invocationHandler侦铜。
調(diào)用jar包中某個類的方法,不能改源碼钉稍,AOP面向切面,增加額外事務邏輯种樱。
適配器模式
適配器模式定義:
將一個類的接口羞秤,轉(zhuǎn)換成期望的另外一個借口,使得由于接口不兼容而不能一起工作的那些類可以一起工作瘾蛋。
適配器模式: 構(gòu)成
構(gòu)成:客戶端俐镐、目標接口、原本接口哺哼、具體請求
適配器模式分類
- 組合
-
繼承
比較
作用
行為型模式
觀察者模式
1. 認識觀察者模式
(1)定義:
定義對象件的一種一對多的依賴關(guān)系佩抹,當一個對象的狀態(tài)發(fā)生改變時,所有依賴它的對象都會得到通知并且自動更新取董,
(2)流程圖:
2. 實現(xiàn)的兩種方式:推模型和拉模型
- 結(jié)構(gòu)
- 觀察者模式通用代碼
步驟:
(1)目標對象的定義
(2)具體的目標對象的定義
(3)觀察者接口的定義
(4)觀察者的具體實現(xiàn)
3. 利用Java提供的觀察者實現(xiàn)
1. 認識觀察者模式
(1)目標與觀察者之間的關(guān)系:一對一棍苹、一對多、多對一等茵汰。
(2)單向依賴:觀察者依賴目標枢里,而不是目標依賴觀察者,觀察者是被動的蹂午,目標是主動的栏豺。
(3)命名建議:
1、目標接口的定義豆胸,建議在名稱后面跟Subject奥洼;
2、觀察者接口的定義晚胡,建議在名稱后面跟Observer灵奖;
3估盘、觀察者接口的更新方法遣妥,建議名稱為update沙咏,參數(shù)的個數(shù)及類型不受限制肢藐。
(4)觸發(fā)通知的時機:目標對象的狀態(tài)發(fā)生維護之后觸發(fā)吆豹。(比如:先賦值內(nèi)容再通知是對的痘煤,而反過來就會出現(xiàn)問題)
(5)觀察者模式調(diào)用時序:見觀察者模式調(diào)用時序圖I、II蘸拔。
(6)通知的順序:不確定调窍,平行的邓萨,沒有相互依賴關(guān)系缔恳。
-
準備階段
-
運行階段
2. 實現(xiàn)的兩種方式:推模型和拉模型
觀察者模式兩種模式:
-
推模型:目標對象主動向觀察者推送目標的詳細信息 ; 推送的信息通常是目標信息的全部或部分信息铃芦。
-
拉模型:目標對象在通知觀察者的時候,只傳遞少量信息 咧虎;如果觀察者需要更具體的信息砰诵,由觀察者主動到目標對象中獲取茁彭,相當于是觀察者從目標對象中拉數(shù)據(jù)理肺;一般這種模型的實現(xiàn)中年枕,會把目標對象自身通過update方法傳遞給觀察者熏兄。
兩種模型的比較:
推模型是假定目標對象知道觀察著需要的數(shù)據(jù)霍弹。
拉模型是目標對象不知道觀察著具體需要什么數(shù)據(jù),因此把自身傳給觀察者耍缴,由觀察者來取值防嗡。
推模型會使觀察者對象難于復用实胸。
拉模型下钢属,update方法的參數(shù)是目標對象本身淆党,基本上可以適應于各種情況的需要山孔。
Java 實現(xiàn) VS 自己實現(xiàn)的對比四點:
(1)不需要再定義觀察者和目標接口(JDK已經(jīng)定義)饱须。
(2)具體的目標實現(xiàn)里面不需要再維護觀察者的注冊信息,Java中的Observable類里面已經(jīng)實現(xiàn)锅铅。
(3)觸發(fā)通知的方式有一點變化盐须,要先調(diào)用setChanged方法贼邓,這個是Java為了幫助實現(xiàn)更精確的觸發(fā)控制而提供的功能塑径。
(4)具體觀察者的實現(xiàn)里面,update方法其實能同時支持推模型和拉模型劳景,這個Java在定義的時候闷串,已經(jīng)考慮烹吵。
4. 簡述觀察者優(yōu)缺點
優(yōu)點: | 缺點點: |
---|---|
1. 觀察者模式實現(xiàn)了觀察者和目標之間的抽象耦合 2. 觀察者模式實現(xiàn)了動態(tài)聯(lián)動 3. 觀察者模式支持廣播通信 | 可能會引起無謂的操作年叮。 |
5. 何時使用觀察者模式
使用觀察者模式的場景 --- 觸發(fā)聯(lián)動(本質(zhì))
1、當一個抽象模型有兩個方面跃惫,其中一個方面的操作依賴于另一個方面的狀態(tài)變化
2爆存、如果更改一個對象的時候携冤,需要同時連帶改變其他的對象曾棕,而且不知道究竟應該有多少對象需要被連帶改變
3翘地、當一個對象必須通知其他的對象,但是你又希望這個對象和其他被通知的對象是松散耦合的
6. 觀察者模式的衍生
觀察者模式——區(qū)別對待觀察者場景問題
- 需求總結(jié)
- 解決思路
(1)情況之一:如果天氣是晴天橙喘,按照黃明的女朋友需要下雨的條件渴杆,黃明的老媽需要下雨或下雪的條件磁奖,則她們倆就都不需要通知了。
(2)情況之二:如果天氣是下雨身诺,則黃明的女朋友需要通知霉赡,而黃明的老媽也需要通知穴亏。
(3)情況之三:如果天氣是下雪嗓化,則只需要通知黃明的老媽严肪。 -
實現(xiàn)步驟:
區(qū)別對待觀察者模式中驳糯,目標父類不實現(xiàn)通知方法结窘,在子類中實現(xiàn)有區(qū)別的通知方法。
狀態(tài)變更調(diào)用通知方法谓苟,通知方法調(diào)用觀察者涝焙,同時回調(diào)目標對象
責任鏈模式
1. 什么是責任鏈模式
將接收者對象連成一條鏈仑撞,并在該鏈上傳遞請求隧哮,直到有一個接收者對象處理它。通過讓更多對象有機會處理請求采蚀,避免了請求發(fā)送者和接收者之間的耦合榆鼠。
2. 如何實現(xiàn)責任鏈模式
流程是 顧客申請折扣,觸發(fā)priceHandler對請求價格的處理责静,在處理價格之前通過工廠方法創(chuàng)建了一個priceHandler的實例灾螃,如果實例處理不了折扣嵌赠,觸發(fā)后繼姜挺,然后調(diào)用工廠設(shè)置后繼并創(chuàng)建新的PriceHandler來處理折扣炊豪,還是處理不了繼續(xù)申請词渤,直到成功。
3. 責任鏈模式如何解耦
加入了新的能夠折扣處理的成員lead類繼承了PriceHandler
對工廠方法進行了改動 添加了lead的實例高氮,以及給lead設(shè)置了后繼Successor
1剪芍、OO的一些原則:
2紊浩、如 單一職責原則 : 設(shè)置一個接口時,應該只將與這個接口業(yè)務相關(guān)的方法放在接口之中口芍。
3鬓椭、工場方法的實質(zhì)在用返回返回的是一個接口小染,而不是一個實例對象资盅。
4呵扛、用到責任鏈今穿,總會用到工廠
將指定的方法移到某個文件中的快捷鍵操作方式:
選中方法名——Refactor——Move——選擇需要移動到的目標文件——確定
責任鏈模式:使用了自身對象后繼
解耦---
責任鏈模式真的好嗎
- 開閉原則(OO中的一個基本原則):
對擴展開放,對變更關(guān)閉,即是如果有一個業(yè)務變更,希望新增一個類,而非修改原有代碼來滿足業(yè)務需求.
- 責任鏈模式的執(zhí)行性能:
當有請求到達時會從責任鏈頭部開始遍歷整條責任鏈,直到有一個處理器處理了請求,或者是整個鏈條遍歷完成,在這過程中性能的損耗體現(xiàn)在兩個方面.
(1)是時間,相對于單個Handler處理請求的時間而言,整個鏈條的遍歷過程會消耗更多的時間.
(2) 是內(nèi)存,使用責任鏈模式創(chuàng)建了大量對象來表示處理器對象,但僅僅使用了其中的少部分,剩余的大部分處理器都僅僅作為一個過客.
4. 責任鏈模式的應用
責任鏈模式在日常編碼中可能不是經(jīng)常用到的模式,但不管是前端還是后端工程師都可能天天接接觸到責任鏈模式.
后端:Java中的異常處理;
前端:JavaScript Event Model芝薇;
Java Web:FilterChain in Web(不純的COR)
1. JAVA中的異常處理機制是使用責任鏈模式
2. JavaScript的事件模式也是責任鏈模式
3. JAVAEE中的Filter
(1)JAVAEE中的Filter經(jīng)陈猓可以在請求到達核心代碼之前對它進行攔截并作出一些操作,當多個Filter存在的時候就共同構(gòu)成了一個FilterChain,FilterChain不是一個存的責任鏈,責任鏈模式中只能有一個對象來處理請求,而FilterChain中可以有多個對象同時處理請求.
5. 各個模式間的聯(lián)系
設(shè)計模式的學習一定要結(jié)合OO的基本原則
面向?qū)ο蟮奈宕笤瓌t:
- 單一職責原則
- 開放封閉原則(對擴展開放口注,對變更封閉)
- 依賴倒置原則(核心是依賴抽象)
- 接口隔離原則
- Liskov替換原則(里氏替換原則)
策略模式
1. 什么是策略模式
策略模式將可變的部分從程序中抽象分離成算法接口寝志,在該接口下分別封裝一系列算法實現(xiàn)。
并使他們可以互相替換乐导。
從而導致客戶端程序獨立于算法的改變旺拉。
2. 策略模式如何實現(xiàn)
鴨子應用的更新需求
鴨子飛行
方案一:繼承
方案二:抽象方法
方案三:組合
1.Favor composition over inheritance:復合(組合)優(yōu)先于繼承仪媒。多用組合规丽,少用繼承冰抢。
2.組合定義:在類中增加一個私有域挎扰,引用另一個已有的類的實例遵倦,通過調(diào)用引用實例的方法從而獲得新的功能,這種設(shè)計被稱作組合(復合)(意思就是:得到其他類的對象掠哥,使用這個對象的方法续搀。)
3. 策略模式總結(jié)
一禁舷、策略模式設(shè)計原則:
- 找出應用中需要變化的部分,把他們獨立出來霜大,不要和那些不需要變化的代碼混在一起战坤;
將不變的東西抽象為接口途茫,而變化的部分交給實現(xiàn)去做囊卜,具體而言雀瓢,鴨子飛行的行為是千變?nèi)f化的刃麸,但是鴨子具有飛行行為本身是不變的泊业,我們將不變的部分抽象為飛行策略接口吁伺,而將具體的飛行行為交給實現(xiàn)去處理篮奄。 - 面向接口編程,而不是面向?qū)崿F(xiàn)編程间校。
- 多用組合页慷,少用繼承。
二州袒、策略模式的實現(xiàn):
- 通過分離變化得出策略接口Strategy郎哭。
- 編寫Strategy的實現(xiàn)類夸研。
- 客戶端程序“有一個”Strategy亥至。
- 在客戶程序中選擇/組裝正確的Strategy實現(xiàn)絮供。
三茶敏、策略模式的優(yōu)點:
- 使用了組合萍肆,使架構(gòu)更加靈活塘揣。
- 富有彈性亲铡,可以較好的應對變化(開閉原則)奖蔓。
- 更好的代碼復用性(相對于繼承)吆鹤。
- 消除了大量的條件語句疑务。
四知允、策略模式的缺點:
- 客戶代碼需要了解每個策略實現(xiàn)的細節(jié),不然就會使得實現(xiàn)有可能有不正確的行為涤垫。
- 隨著時間的推移,策略接口會急劇膨脹股缸,增加了對象的數(shù)目敦姻。
五镰惦、策略模式的適用場景:
- 許多相關(guān)的類僅僅是行為差異,將差異的共享分離出來成為一個策略接口茵瘾,而這些相關(guān)的類便成為其算法家族的成員拗秘。
- 運行時選取不同的算法變體雕旨。
- 通過條件語句在多個分支中選取一個,使用策略模式使得代碼更加簡潔疹蛉。
4. 實際案例分享
模板方法模式
1. 什么是模板方法模式
(1) 模板模式
定義了一個操作中的算法骨架,而將一些步驟延遲到子類中實現(xiàn),使得子類在不改變一個算法結(jié)構(gòu)的同時,就重新定義該算法的特定步驟.
=>
(2) 生活案例——飲料的調(diào)制方法
=>
2. 如何實現(xiàn)模板方法模式
- 定義抽象基類
(1)實現(xiàn)方法(通用共同屬性)
(2)抽象方法(延遲方法)
(3)鉤子方法(擴展點)
(4)模板方法(一定要用final因為要禁止子類對方法框架的覆寫) - 子類
模板方法的基本實現(xiàn)
思想
1、一份算法框架座慰,大家共同遵守
2、 算法框架中分離出變與不變的部分
3误墓、將變化的算法,延遲實現(xiàn)(交由具體的子類實現(xiàn))
基本實現(xiàn)
1然想、用一個抽象基類变泄,一個public final方法定義好算法框架
2妨蛹、不變的部分,用private方法加以實現(xiàn)颤难。(基本方法)
3行嗤、變化的部分昂验,用protected abstract加以定義(抽象方法)
使用
1既琴、面向接口編程
2、傳入實際的實現(xiàn)子類給接口變量
3磺箕、接口變量調(diào)用框架方法
用鉤子(Hook)函數(shù)實現(xiàn)子類對算法框架個性化的擴展
1松靡、思想
框架通過提供一個個的鉤子,使框架具備了更大的靈活性屠列。不想執(zhí)行算法框架中的某些個步驟笛洛,我們可以脫鉤苛让,如果想執(zhí)行的話溉贿,我們可以掛鉤浦旱。
2宣蠕、實現(xiàn)
在抽象類中抢蚀,提供protected鉤子方法。這是個實現(xiàn)的或空的方法吴侦。這樣子類就可以選擇覆寫-持鉤劫樟,也可以選擇不覆寫-脫勾。
3附较、使用
提供一個isXXX類型的鉤子方法拒课。用該方法控制算法框架中
4、某個步驟是否執(zhí)行
子類不覆寫這個方法扎酷,就是脫鉤,仍按框架邏輯執(zhí)行幅聘,一旦覆寫凡纳,就是掛鉤,將改變框架算法方向帝蒿,按子類邏輯執(zhí)行荐糜。
3. 模板方法模式的特點
一、模板方法模式的實現(xiàn)要素:
準備一個抽象類葛超,將部分邏輯以具體方法的形式實現(xiàn)暴氏,然后聲明一些抽象方法交由子類實現(xiàn)剩余邏輯,用鉤子方法給予子類更大的靈活性。最后將方法匯總構(gòu)成一個不可改變的模板方法。
二、從類的角度看:
(1)抽象基類
1、基本方法。
2、抽象方法【只知道具體原則灵嫌,而不知道實現(xiàn)細節(jié)绪穆,需要將其延遲到子類中實現(xiàn)的一些步驟】第岖。
3键袱、可選鉤子(Hook比藻,鉤子函數(shù)务蝠,提供一個默認或空的實現(xiàn)。具體的子類可以自行決定是否掛鉤以及如何掛鉤)。
4淋肾、Template方法(final 使其不能被子類所覆寫 模板方法模式要遵循的原則:子類可以替換掉父類中的可變邏輯杠河,但不能改變整體邏輯結(jié)構(gòu)))陪白。
(2)具體子類
1序厉、實現(xiàn)基類中的抽象方法。
2、覆蓋鉤子方法。
三粥帚、模板方法的優(yōu)點:
(1)封裝性好掂恕。(2)復用性好。(3)屏蔽細節(jié)。(4)便于維護。
四、模板方法的缺點:
(1)繼承限制(Java語言是單繼承語言)忽舟,單繼承會使得更多情況不可用,新類引入困難。
五骆莹、模板方法模式的適用場景:
(1)算法或操作遵循相似的邏輯蒸走。
(2)重構(gòu)時(把相同的代碼抽取到父類中)掸掸。
(3)重要粒督、復雜的算法礁哄,核心算法設(shè)計為模板方法蚀乔。