美文网首页
模板方法模式

模板方法模式

作者: 一毛钱 | 来源:发表于2019-03-31 22:08 被阅读0次

模版方法模式定义

使用模板方法模式,可以允许第三方开发者以创建子类或者定义闭包的方式,替换一个算法的某些步骤的具体实现。 当你需要实现一些默认行为,同时又想允许其他开发者对其进行修改时,可以使用此模式。
第一点:定义一个操作中的算法框架
第二点:将一些步骤延时到子类实现
第三点:子类可以不改变算法结构,可以重新定义算法的某些特定步骤

优点

在开发允许其他开发者进行扩展和定制框架时,此模式非常实用。

模版方法模式应用场景

使用此模式,可以选择性的允许外界在不修改原有类的情况下,修改任意算法中的某些步骤的具体实现。
注意:模板方法模式,只适用于部分步骤需要保持不变算法,算法中的变化的部分可由调用组件提供,以实现完整的算法并生成相应的结果。
场景一:多个子类有公有方法,且逻辑基本相同
场景二:重复、复杂的算法,将核心算法设计为模版方法,其周边细节可以由各个子类实现
场景三:代码重构

模版方法模式->角色划分

两个角色
角色一:抽象类->作用(定义算法框架结构,将一些特定步骤延时到子类实现)
角色二:具体模版实现类,不改变算法结构,选择性去实现某些特定步骤。

模版方法模式-原理案例

电脑开机过程->开机过程
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方法。使用的就是模板方法模式。

总结

假设步骤一 + 步骤二固定不变默认实现,只需要实现步骤三 + 步骤四,非常灵活
地图加载也是如此,你也将某些特定公共功能,抽象为模版类,子类只需要实现具体的功能即可。
模板方法模式,让苹果可以定义一组固定类,并在其中定义一些默认的行为,第三方开发者可以根据需要对其进行重写。

相关文章

网友评论

      本文标题:模板方法模式

      本文链接:https://www.haomeiwen.com/subject/knkpbqtx.html