什么是模板方法模式

假如我们有一些平行的子类,各个子类之间有一些相同的行为,也有一些不同的行为。如果相同和不同的行为都混合在各个子类的实现中,说明这些相同的行为会在各个子类中重复出现。但实际上,相同的行为可以被搬到另外一个单一的地方,模板方法就是为解决这个问题而生的。

在模板方法中,可以使用钩子方法来隔离变化。我们在父类种容易变化的地方放置钩子,钩子可以有一个默认的实现,究竟要不要挂钩,这由子类自行决定。

模板方法模式是一种典型的通过封装变化提高系统扩展性的设计模式。子类的方法种类和执行顺序都是不变的,所以我们把这部分逻辑抽象到父类的模板方法中,而子类的方法具体怎么实现则是可变的,把这部分变化的逻辑封装到子类中。

面向对象例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
export class RenderDom{
constructor() {

}

createDom() {
throw new Error('Must need implement createDom function');
}

configStyle() {
throw new Error('Must need implement configStyle function');
}

appendToParent() {
throw new Error('Must need implement appendToParent function');
}
}



export class RenderDiv extends RenderDom {
constructor() {
super();
}

createDom() {
console.log('div created');
}
}

函数式例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
export const renderDom = function(obj) {
let createDom = obj.createDom || function() {
throw new Error('Must need implement createDom function');
}
let configStyle = obj.configStyle || function() {
throw new Error('Must need implement configStyle function');
}
let appendToParent = obj.appendToParent || function() {
throw new Error('Must need implement appendToParent function');
}
let F = function() {};
F.prototype.createDom = createDom;
F.prototype.configStyle = configStyle;
F.prototype.appendToParent = appendToParent;

return F;
}