Z

模板方法模式(Template Method Pattern)

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

模板方法模式太常用了,太简单了,以至于可以能写了很久的代码,才发现写过的很多代码都使用了模板方法模式,那么它到底是什么呢?

 1abstract class Dialog {
 2    private close() {
 3
 4    }
 5
 6    private drag() {
 7        if (!this.draggable()) return;
 8
 9        // ...
10    }
11
12    title() {
13        return "this is title";
14    }
15
16    content() {
17        return "this is content";
18    }
19
20    draggable() {
21        return true;
22    }
23}
24
25class ErrorDialog extends Dialog {
26    title() {
27        return "Error";
28    }
29}
30
31
32class SuccessDialog extends Dialog {
33    title() {
34        return "Success";
35    }
36
37    draggable() {
38        return false;
39    }
40}

也许你会感到震惊,这不就是平时最常用继承么?对,它确实有个高大上的名字“模板方法模式”。

Dialog 叫做抽象模板,他的方法分为三类

  • 基本方法,或子类方法,由子类实现,或直接继承自抽象类,用于一些可变的、可扩展的逻辑,例如上面的title,content方法
  • 模板方法,模板内部逻辑的方法,不应该向外暴露,最好加上private关键字,防止子类继承,例如上面的close方法
  • 钩子方法,让子类有权限控制模版的一些行为,例如上面的draggable方法,默认返回true,子类SuccessDialog覆盖了它返回了false,那么SuccessDialog将不再具有drag的行为。

我最常在React开发中使用模板方法模式,子组件继承父组件,覆盖一些公共属性。在React体系中还有另外一种组件继承方式:HOC,关于两者的优劣需要再写一篇文章才能详细对比出来。在这里只需要知道,模板方法模式其实就是我们平时最常用的继承。