模版方法模式定义
使用模板方法模式,可以允许第三方开发者以创建子类或者定义闭包的方式,替换一个算法的某些步骤的具体实现。 当你需要实现一些默认行为,同时又想允许其他开发者对其进行修改时,可以使用此模式。
第一点:定义一个操作中的算法框架
第二点:将一些步骤延时到子类实现
第三点:子类可以不改变算法结构,可以重新定义算法的某些特定步骤
优点
在开发允许其他开发者进行扩展和定制框架时,此模式非常实用。
模版方法模式应用场景
使用此模式,可以选择性的允许外界在不修改原有类的情况下,修改任意算法中的某些步骤的具体实现。
注意:模板方法模式,只适用于部分步骤需要保持不变算法,算法中的变化的部分可由调用组件提供,以实现完整的算法并生成相应的结果。
场景一:多个子类有公有方法,且逻辑基本相同
场景二:重复、复杂的算法,将核心算法设计为模版方法,其周边细节可以由各个子类实现
场景三:代码重构
模版方法模式->角色划分
两个角色
角色一:抽象类->作用(定义算法框架结构,将一些特定步骤延时到子类实现)
角色二:具体模版实现类,不改变算法结构,选择性去实现某些特定步骤。
模版方法模式-原理案例
电脑开机过程->开机过程
1、激活电源(按下电源)
2、检测硬件
3、启动系统(加载系统)
4、登录系统
模版类:流程统一的(算法框架)
抽象类:TemplateMethodComputer
具体类:HuaweiComputer
案例代码
//模版类:定义了算法框架结构(设计模式->结构)
class TemplateMethodComputer: NSObject {
override init() {
super.init()
}
// 电脑开机过程->开机过程
// 1、激活电源(按下电源)
func powerUp() {
print("按下电源...")
}
// 2、检测硬件
func checkHardware() {
print("检测硬件...")
}
// 3、启动系统(加载系统)
func loadOS() {
print("启动系统...")
}
// 4、登录系统
func login() {
print("登录系统...")
}
// 模版类:流程统一的(算法框架)->开机
final func startup() {
//1、激活电源(按下电源)
powerUp()
//2、检测硬件
checkHardware()
//3、启动系统(加载系统)
loadOS()
//4、登录系统
login()
}
// 抽象类:TemplateMethodComputer
}
//模板模式角色二: 开机修改项华为电脑
class HuaweiComputer: TemplateMethodComputer {
override func loadOS() {
print("加载华为系统...")
}
override func login() {
print("登录华为系统...")
}
}
//外部调用
let huawei = HuaweiComputer()
huawei.startup()
Cocoa中使用
viewController类继承自UIViewController,它在实现中重写了父类的viewDidLoad方法。使用的就是模板方法模式。
总结
假设步骤一 + 步骤二固定不变默认实现,只需要实现步骤三 + 步骤四,非常灵活
地图加载也是如此,你也将某些特定公共功能,抽象为模版类,子类只需要实现具体的功能即可。
模板方法模式,让苹果可以定义一组固定类,并在其中定义一些默认的行为,第三方开发者可以根据需要对其进行重写。
网友评论