定義一個(gè)算法的結(jié)構(gòu),作為一系列的高層次的步驟,使每一個(gè)步驟的行為可以指定,使屬于一個(gè)族的算法都具有相同的結(jié)構(gòu)但是有不同的行為。
使用模板方法( Template Method )在父類中描述算法的結(jié)構(gòu),再授權(quán)一個(gè)或多個(gè)具體子類來(lái)具體地進(jìn)行實(shí)現(xiàn)。
例如,想象你希望模擬各種類型的文件的生成,并且每個(gè)文件要包含一個(gè)標(biāo)題和正文。
class Document
produceDocument: ->
@produceHeader()
@produceBody()
produceHeader: ->
produceBody: ->
class DocWithHeader extends Document
produceHeader: ->
console.log "Producing header for DocWithHeader"
produceBody: ->
console.log "Producing body for DocWithHeader"
class DocWithoutHeader extends Document
produceBody: ->
console.log "Producing body for DocWithoutHeader"
docs = [new DocWithHeader, new DocWithoutHeader]
doc.produceDocument() for doc in docs
在這個(gè)實(shí)例中,算法用兩個(gè)步驟來(lái)描述文件的生成:其一是產(chǎn)生文件的標(biāo)題,另一步是生成文件的正文。父類中是實(shí)現(xiàn)每一個(gè)步驟的空的方法,多態(tài)性使得每一個(gè)具體的子類可以通過(guò)重寫(xiě)一步步的方法來(lái)實(shí)現(xiàn)對(duì)方法不同的利用。在本實(shí)例中,DocWithHeader 實(shí)現(xiàn)了正文和標(biāo)題的步驟, DocWithoutHeader 只是實(shí)現(xiàn)了正文的步驟。
不同類型文件的生成就是簡(jiǎn)單的將文檔對(duì)象存儲(chǔ)在一個(gè)數(shù)組中,簡(jiǎn)單的遍歷每個(gè)文檔對(duì)象并調(diào)用其 produceDocument 方法的問(wèn)題。