模板方法模式:在超類(lèi)中定義了一個(gè)算法的框架, 允許子類(lèi)在不修改結(jié)構(gòu)的情況下重寫(xiě)算法的特定步驟。
現(xiàn)在有個(gè)訂單要處理,我們定義超類(lèi):
class OrderProcess: NSObject {
func createOrder(productId: Int) -> String {
print("正在生成商品:\(productId)的訂單")
return "order....."
}
func pay(orderId: String) -> Bool {
return false
}
func resultBack(){
}
}
超類(lèi)里定義了處理訂單的步驟,生成訂單,支付訂單,結(jié)果回調(diào),我們生成訂單的方式是一樣的,但是支付方式和結(jié)果回調(diào)卻可能不同,比如微信支付、支付寶支付。
現(xiàn)在我們搞個(gè)微信支付的訂單處理:
class WeixinOrderProcess: OrderProcess {
override func pay(orderId: String) -> Bool {
print("正在調(diào)起微信支付\(orderId)")
return true
}
override func resultBack() {
print("微信支付成功")
}
}
然后再搞個(gè)支付寶支付的方法:
class AliOrderProcess: OrderProcess {
override func pay(orderId: String) -> Bool {
print("正在調(diào)起支付寶支付\(orderId)")
return true
}
override func resultBack() {
print("支付寶支付成功")
}
}
這樣客戶端可以選擇不同的支付方式來(lái)處理訂單,復(fù)用了訂單生產(chǎn)的邏輯:
let ali = AliOrderProcess()
let aliorderId = ali.createOrder(productId: 100)
ali.pay(orderId: aliorderId)
ali.resultBack()
let weixin = WeixinOrderProcess()
let weixinorderId = weixin.createOrder(productId: 100)
weixin.pay(orderId: weixinorderId)
weixin.resultBack()
正在生成商品:100的訂單
正在調(diào)起支付寶支付order.....
支付寶支付成功
正在生成商品:100的訂單
正在調(diào)起微信支付order.....
微信支付成功
當(dāng)然,這里只是演示模板方法模式,在實(shí)際應(yīng)用中,訂單生產(chǎn)在前,支付方式選擇在后,肯定會(huì)在訂單處理類(lèi)里有個(gè)支付方式的屬性,使用組合模式來(lái)處理。
模板方法模式注重通用方法和詳細(xì)步驟的現(xiàn)實(shí),公用部分邏輯,然后子類(lèi)去實(shí)現(xiàn)不同詳細(xì)步驟,這樣如果想要替換掉一些步驟,就可以再創(chuàng)建一個(gè)子類(lèi)去實(shí)現(xiàn),不用修改原來(lái)的類(lèi)。
比如高德地圖里,路徑規(guī)劃時(shí),首先接收兩個(gè)地點(diǎn),分別計(jì)算出經(jīng)緯度,然后才會(huì)根據(jù)不同的出行方式,選擇不同的路徑實(shí)現(xiàn)步驟,就可以用模板方法模式來(lái)實(shí)現(xiàn)。