https://mp.weixin.qq.com/s/YAiJTn1ESyb1mRrKxGdOKw
https://www.yuque.com/wubinhp/uxiv5i/kouxax#pUaQJ
在传统的面型对象语言中,一个运用了模板方法模式的程序中,子类的方法种类和执行顺序都是不变的,所以我们把这部分逻辑抽象到父类的模板方法中。而子类的方法具体怎么实现则是可变的,于是我们把这部分变化的逻辑封装到子类,我们便能给系统增加新的功能,并不需要改动抽象父类以及其他子类,这也是符合开放-闭合原则的。
定义:允许子类别为一个或多个步骤提供其实现方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
用类实现
/* 虚拟方法 */
const abstractFunc = function () {
throw new Error("抽象方法不能调用!");
};
/* 饮料方法 */
class AbstractClass {
constructor({
operate2 = abstractFunc, // 抽象方法
}) {
this.operate2 = operate2;
}
/* 共用方法 */
operate1() {
console.log("operate1");
}
/* 模板方法 */
init() {
this.operate1();
this.operate2();
}
}
/* 实例 */
const instance = new AbstractClass({
/* 覆盖抽象方法 */
operate2: function () {
console.log("operate2");
},
});
instance.init();
// 输出:operate1
// 输出:operate2
JS实现
var father = function (params) {
var step0 = function () {
console.log("step0");
};
var step1 =
params.step1 ||
function () {
return true;
};
var step2 =
params.step2 ||
function () {
throw new Error("need step2");
};
var execute = function () {
step0();
if (!step1()) return;
step2();
};
return execute;
};
var child = {
step1() {
console.log("step1");
return true;
},
step2() {
console.log("step2");
},
};
var child1 = father(child);
child1();
目的就是为了子类去实现父类的部分方法,父类按一定的逻辑调用方法。