# 设计模式:模板方法模式
模板方法模式的定义和组成 第一个例子——Coffee or Tea 抽象类 模板方法模式的使用场景 钩子方法 好莱坞原则 真的需要“继承”吗
# 什么是模板方法模式
在父类中定义一个方法,这个方法约定所有的子类都要按照顺序调用另外一批方法。这个方法是某个行为的模板,也称之为模板方法
比如:build(),playVideo() 这类功能型方法,一定会调用一批方法来完成任务。那么这些方法如果在父类中定义了,那就是模板方法。
# Coding
// 父类:计算机
var Computer = function(name) {
this.name = name || 'Computer'
}
// 连接电源
Computer.prototype.installBattery = function() {
throw new Error('子类未实现..'); // 异常处理
}
// 连接显示器
Computer.prototype.installMonitor = function() {
throw new Error('子类未实现..'); // 异常处理
}
// 模板方法的钩子函数:是否有其他的操作
Computer.prototype.customerWantsCondiments = function() {
return false
}
// 其他操作
Computer.prototype.addCondiments = function() { }
// 模板方法
Computer.prototype.init = function() {
console.log(this.name + '准备开机')
this.installBattery()
this.installMonitor()
if (this.customerWantsCondiments()) {
this.addCondiments()
}
console.log('已开机...')
}
function extend(fn, superFn) {
var TempFn = function() {
this.constructor = fn
}
TempFn.prototype = new superFn()
fn.prototype = new TempFn();
}
// 子类:PC机
var PC = function() {}
extend(PC, Computer)
PC.prototype.installBattery = function() {
console.log("连接主机")
}
PC.prototype.installMonitor = function() {
console.log("连接显示器")
}
// 子类:手机
var Phone = function() {}
extend(Phone, Computer)
Phone.prototype.installBattery = function() {
console.log('安装电池')
}
Phone.prototype.installMonitor = function() {
console.log('安装液晶屏')
}
Phone.prototype.addCondiments = function() {
console.log('安装主板')
console.log('安装手机卡槽')
}
Phone.prototype.customerWantsCondiments = function() {
return true
}
new Phone().init()
new PC().init()
# 总结
模板方法模式,是典型的封装变化来提高系统扩展性的设计模式。父类定义函数的调用顺序,子类只需要关心具体功能实现。而且子类的灵活性也可以通过模板钩子来体现。