Skip to content

Latest commit

 

History

History
57 lines (44 loc) · 1.29 KB

15模板方法模式.md

File metadata and controls

57 lines (44 loc) · 1.29 KB

模板方法模式

父类定义的流程和模板方法,子类实现

解决问题:

  • 算法步骤的骨架和具体实现分离

优点:

  • 封装了不变部分,扩展了可变部分
  • 符合开放-封闭原则

缺点:

  • 增加系统复杂度

与其他设计模式的区别:

  • 模板方法模式:提取的是算法的骨架结构
  • 抽象工厂模式:提取的是实例的功能结构

代码实现

/* 抽象父类 */
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

参考

JavaScript 设计模式精讲 - 第四章 21模板方法模式