模版方法模式 (template method pattern) , 又叫模版模式(template pattern),在乙個抽象類公開定義類執行它的方法的模版。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義但方式進行。
模版方法模式定義類乙個操作中但演算法但骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法但結構,就可以重定義該演算法但某些特徵
模版方法模式屬於行為型模式
原理**析:
豆漿製作問題
製作豆漿的流程 選材 —> 新增配料 —> 浸泡 —> 放到豆漿機打碎
通過替阿甲不同的配料,可以製作出不同口味的豆漿
選材、浸泡的放到豆漿機這幾個步驟 對於美中口味的豆漿都是一樣的
編寫模版類
public
abstract
class
soyamilk
/** * 選材料
*/private
void
select()
/** * 新增不同的材料
*/abstract
void
addcondiments()
;/**
* 浸泡
*/private
void
soak()
/** * 放到豆漿機
*/private
void
beat()
}
子類實現
public
class
blackbeansoyamilk
extends
soyamilk
}
public
class
peanutsoyamilk
extends
soyamilk
}
客戶端
在模版方法模式的父類中,我媽可以定義乙個方法,它預設不做任何事,子類可以看情況可不可以覆蓋他,該方法稱為鉤子
public
abstract
class
soyamilk
soak()
;beat()
;}/** * 選材料
*/private
void
select()
/** * 新增不同的材料
*/abstract
void
addcondiments()
;/**
* 浸泡
*/private
void
soak()
/** * 放到豆漿機
*/private
void
beat()
/** * 鉤子方法
*/boolean
customerwantcondiments()
}
實現鉤子
public
class
puresoyamilk
extends
soyamilk
@override
boolean
customerwantcondiments()
}
客戶端
spring中幾乎所有的擴充套件,都使用了模板方法模式,這裡說下ioc部分的模板方法模式!
兩個鉤子方法
protected
void
postprocessbeanfactory
(configurablelistablebeanfactory beanfactory)
protected
void
onrefresh()
throws bean***ception
public
final configurablelistablebeanfactory getbeanfactory()
else
}@override
protected
final
void
refreshbeanfactory()
throws bean***ception
trycatch
(ioexception ex)
}
private
final defaultlistablebeanfactory beanfactory;
@override
public
final configurablelistablebeanfactory getbeanfactory()
@override
protected
final
void
refreshbeanfactory()
throws illegalstateexception
this
.beanfactory.
setserializationid
(getid());}
github demo位址 : ~~~傳送門~~~ 深入理解23種設計模式 23 責任鏈模式
責任鏈模式 chain of responsibility pattern 為請求者建立乙個接受者物件的鏈,這種模式對請求對傳送者和請求者進行解耦。責任鏈模式通常每個接收者都包含對另乙個接收者都引用,如果乙個物件不能處理該請求,那麼他就會把相同的請求傳給下乙個接收者解耦,以此類推。這種型別的設計模式...
深入理解23種設計模式 9 外觀模式
外觀模式 facade pattern 門面模式,隱藏系統的複雜性,並向客戶端提供了乙個客戶端可以訪問系統的介面,這種型別的設計模式屬於結構型模式,他向現有的系統新增乙個介面,來隱藏系統的複雜性,這種模式涉及到乙個單一的類,該類提供類乙個客戶端請求的簡化方法和對現有系統類方法對委託呼叫 傳送郵件 p...
深入理解23種設計模式 13 命令模式
命令模式 command pattern 在軟體設計中,我們經常需要向某些物件傳送請求,但是並布置的請求的接收者是誰,也不知道被請求的操作是哪個,我們只需要程式執行時指定具體的請求接受者即可,此時,可以使用命令模式來進行設計 命令模式使得請求傳送者與請求接收者消標題 除彼此間的耦合,讓物件之間呼叫關...