父类定义的流程和模板方法,子类实现
解决问题:
- 算法步骤的骨架和具体实现分离
优点:
- 封装了不变部分,扩展了可变部分
- 符合开放-封闭原则
缺点:
- 增加系统复杂度
与其他设计模式的区别:
- 模板方法模式:提取的是算法的骨架结构
- 抽象工厂模式:提取的是实例的功能结构
/* 抽象父类 */
class AbstractClass {
constructor() {
if (new.target === AbstractClass) {
throw new Error('抽象类不能直接实例化!')
}
}
/* 共用方法 */
operate1() { console.log('operate1') }
/* 抽象方法 */
operate2() { throw new Error('抽象方法不能调用!') }
/* 模板方法 */
templateMethod() {
this.operate1()
this.operate2()
}
}
/* 实例子类,继承抽象父类 */
class ConcreteClass extends AbstractClass {
constructor() { super() }
/* 覆盖抽象方法 operate2 */
operate2() { console.log('operate2') }
}
const instance = new ConcreteClass()
instance.templateMethod()
// 输出:operate1
// 输出:operate2