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();
目的就是为了子类去实现父类的部分方法,父类按一定的逻辑调用方法。
