一、定义
模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。
二、核心
在抽象父类中封装子类的算法框架,它的 init方法可作为一个算法的模板,指导子类以何种顺序去执行哪些方法。
由父类分离出公共部分,要求子类重写某些父类的(易变化的)抽象方法
三、实现
模板方法模式一般的实现方式为继承,最终子类直接调用父类的模板函数来执行。
// 抽象出的员工类
class Staff {
constructor(name) {
this.name = name
}
// 模板方法,负责调度基本方法,子类不可实现,按顺序执行
init () {
console.log('\n===== 员工: ' + this.name + ' =====')
this.goto()
console.log('-打上班卡->')
this.work()
console.log('<-打下班卡-')
this.leave()
}
// 去上班
goto() { }
// 离开
leave() { }
// 工作
work () { }
}
// 具体实现:老王
class LaoWang extends Staff {
goto () {
console.log('骑车上班')
}
leave () {
console.log('骑车下班')
}
work () {
console.log('开会')
console.log('干活')
console.log('沟通客户')
}
}
// 具体实现:小明
class XiaoMing extends Staff {
goto () {
console.log('地铁上班')
}
leave () {
console.log('打车下班')
}
work () {
console.log('打盹')
console.log('刷网页')
console.log('耍手机')
}
}
const wang = new LaoWang('老王')
wang.init()
const ming = new XiaoMing('小明')
ming.init()
// 输出:
===== 员工: 老王 =====
骑车上班
-打上班卡->
开会
干活
沟通客户
<-打下班卡-
骑车下班
===== 员工: 小明 =====
地铁上班
-打上班卡->
打盹
刷网页
耍手机
<-打下班卡-
打车下班