再一次,javascript设计模式与开发实践-模板模式

简述

一种典型的通过封装变化来提高可扩展性的模式。

模板模式由两个部分组成,一个抽象父类,一个具体子类,通常父类中封装了子类可用的公共实现,子类通过继承父类,也就继承了整个父类的实现,那么模板模式可以重写方法,或者直接重写父类方法。

使用场景

  • 过程类似,方式一致的

案例

咖啡和茶是一个典型的,泡咖啡和泡茶都是一样的方式,只是过程不同。

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var Beverage = function(param) {
    var boilWater = function() {
        console.log('把水煮沸');
    };

    var brew = param.brew || function() {
        throw  new Error('必须传递此方法');
    };

    var pourInCup = param.pourInCup || function() {
        throw  new Error('必须传递此方法');
    };

    var addCondiments = param.addCondiments || function() {
        throw  new Error('必须传递此方法');
    };

    var F = function() {};

    F.prototype.init = function() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    };

    return F;
};


var Coffee = Beverage({
    brew: function() {
        console.log('冲泡咖啡');
    },
    pourInCup: function() {
        console.log('倒进杯子');
    },
    addCondiments: function() {
        console.log('加糖和咖啡');
    }
});

var Tea = Beverage({
    brew: function() {
        console.log('冲泡茶叶');
    },
    pourInCup: function() {
        console.log('倒进杯子');
    },
    addCondiments: function() {
        console.log('加🍋');
    }
});

var coffee = new Coffee();
coffee.init();

var tea = new Tea();
tea.init();