模板方法模式

111 阅读2分钟

1.定义

模板方法模式是一种只需使用继承就可以实现的非常简单的模式。

模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。通常 在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺 序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法

2.Coffer or Tea的例子

泡一杯咖啡和茶的步骤分别是这些步骤 image.png 我们找到泡咖啡和泡茶主要有以下不同点。

  • 原料不同。一个是咖啡,一个是茶,但我们可以把它们都抽象为“饮料”。
  • 泡的方式不同。咖啡是冲泡,而茶叶是浸泡,我们可以把它们都抽象为“泡”。
  • 加入的调料不同。一个是糖和牛奶,一个是柠檬,但我们可以把它们都抽象为“调料”。

经过抽象之后,不管是泡咖啡还是泡茶,我们都能整理为下面四步:

  1. 把水煮沸
  2. 用沸水冲泡饮料
  3. 把饮料倒进杯子
  4. 加调料

所以可以创建一个饮料类来当作父类,其他所有饮料都是通过这个父类来实现冲泡过程,只不过是不同的饮料,接下来就可以在创建对应的咖啡类茶类通过prototype来实现继承饮料类,在子类中重写对应的饮料所需要的方法,但是整体流程还是父类的init方法

// 饮料类
var Beverage = function () {};

Beverage.prototype.boilWater = function () {
  console.log("把水煮沸");
};

Beverage.prototype.brew = function () {}; // 子类重写

Beverage.prototype.pourInCup = function () {};

Beverage.prototype.addCondiments = function () {};

Beverage.prototype.init = function () {
  this.boilWater();
  this.brew();
  this.pourInCup();
  this.addCondiments();
};

// 咖啡类
var Coffee = function () {};

Coffee.prototype = new Beverage();

Coffee.prototype.brew = function () {
  console.log("用沸水冲泡咖啡");
};

Coffee.prototype.pourInCup = function () {
  console.log("把咖啡倒进杯子");
};

Coffee.prototype.addCondiments = function () {
  console.log("加糖和牛奶");
};

// 茶类
var Tea = function () {};

Tea.prototype = new Beverage();

Tea.prototype.brew = function () {
  console.log("用沸水冲泡茶");
};

Tea.prototype.pourInCup = function () {
  console.log("把茶倒进杯子");
};

Tea.prototype.addCondiments = function () {
  console.log("加柠檬");
};
var coffee = new Coffee();
coffee.init();

var tea = new Tea();
tea.init();

3.总结

模板方法模式是一种典型的通过封装变化提高系统扩展性的设计模式。在传统的面向对象语 言中,一个运用了模板方法模式的程序中,子类的方法种类和执行顺序都是不变的,所以我们把 这部分逻辑抽象到父类的模板方法里面。而子类的方法具体怎么实现则是可变的,于是我们把这 部分变化的逻辑封装到子类中。通过增加新的子类,我们便能给系统增加新的功能,并不需要改 动抽象父类以及其他子类,这也是符合开放封闭原则的。

但在JavaScript 中,我们很多时候都不需要依样画瓢地去实现一个模版方法模式,高阶函数 是更好的选择。