# 设计模式:模板方法模式

模板方法模式的定义和组成 第一个例子——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()

# 总结

模板方法模式,是典型的封装变化来提高系统扩展性的设计模式。父类定义函数的调用顺序,子类只需要关心具体功能实现。而且子类的灵活性也可以通过模板钩子来体现。

上次更新: 9/12/2020, 12:12:30 AM