模板方法模式:在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
现在有个订单要处理,我们定义超类:
class OrderProcess: NSObject {
func createOrder(productId: Int) -> String {
print("正在生成商品:\(productId)的订单")
return "order....."
}
func pay(orderId: String) -> Bool {
return false
}
func resultBack(){
}
}
超类里定义了处理订单的步骤,生成订单,支付订单,结果回调,我们生成订单的方式是一样的,但是支付方式和结果回调却可能不同,比如微信支付、支付宝支付。
现在我们搞个微信支付的订单处理:
class WeixinOrderProcess: OrderProcess {
override func pay(orderId: String) -> Bool {
print("正在调起微信支付\(orderId)")
return true
}
override func resultBack() {
print("微信支付成功")
}
}
然后再搞个支付宝支付的方法:
class AliOrderProcess: OrderProcess {
override func pay(orderId: String) -> Bool {
print("正在调起支付宝支付\(orderId)")
return true
}
override func resultBack() {
print("支付宝支付成功")
}
}
这样客户端可以选择不同的支付方式来处理订单,复用了订单生产的逻辑:
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的订单
正在调起支付宝支付order.....
支付宝支付成功
正在生成商品:100的订单
正在调起微信支付order.....
微信支付成功
当然,这里只是演示模板方法模式,在实际应用中,订单生产在前,支付方式选择在后,肯定会在订单处理类里有个支付方式的属性,使用组合模式来处理。
模板方法模式注重通用方法和详细步骤的现实,公用部分逻辑,然后子类去实现不同详细步骤,这样如果想要替换掉一些步骤,就可以再创建一个子类去实现,不用修改原来的类。
比如高德地图里,路径规划时,首先接收两个地点,分别计算出经纬度,然后才会根据不同的出行方式,选择不同的路径实现步骤,就可以用模板方法模式来实现。