模块方法模式
定义:
模块方法模式是一种需要使用继承就可以实现的模式。
由2部分组成,第一部分是抽象父类,第二部分是具体的实现子类。
通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有的方法的执行顺序。子类通过继承这个抽象的类,也继承了整个算法结构,并且可以选择重写父类的方法。
例子:Coffer or Tea
泡一杯咖啡
首先我们泡一杯咖啡,基本步骤是:
- 把开水煮沸
- 用沸水冲泡咖啡
- 把咖啡倒入杯子
- 加糖和牛奶123456789101112131415161718192021222324var Coffee = function(){};Coffee.prototype.boilWater = function(){console.log('把水煮沸');}Coffee.prototype.brewCoffee = function(){console.log('冲泡咖啡');}Coffee.prototype.pourInCup = function(){console.log('把咖啡倒入杯子');}Coffee.prototype.addSomething = function(){console.log('加糖和牛奶');}Coffee.prototype.init = function(){this.boilWater();this.brewCoffee();this.pourInCup();this.addSomething();}var coffee = new Coffee();coffee.init();
泡一杯茶
和泡咖啡的步骤相差不大
- 把水煮沸
- 用沸水冲泡茶叶
- 把茶倒入杯子
- 加柠檬123456789101112131415161718192021222324var Tea = function(){};Tea.prototype.boilWater = function(){console.log('把水煮沸');}Tea.prototype.brewTea = function(){console.log('冲泡茶叶');}Tea.prototype.pourInCup = function(){console.log('把茶倒入杯子');}Tea.prototype.addSomething = function(){console.log('加柠檬');}Tea.prototype.init = function(){this.boilWater();this.brewTea();this.pourInCup();this.addSomething();}var tea = new Tea();tea.init();
分离出共同点
不管是泡咖啡还是泡茶都要经历以下几个步骤:
- 把水煮沸
- 用沸水冲泡原料
- 把成品倒入杯子
- 加配料
所以,不管是泡什么原料,我们都可以给它一个新的方法名称,例如:brew( ) 。
同理,不管是加什么配料,我们也可以给他一个新的方法名称,例如:add( ) 。
因此,不管是泡什么东西,我们就可以给他一个新的父类名称,例如:Beverage( )。
|
|
创建coffee和tea子类
现在创建一个Drunk类的对象对我们来说没有意义,因为饮品有非常多种,在这里Drunk只是一个抽血的存在。接下来我们要创建咖啡喝茶类,让他们继承饮品Drunk类。
接下来照葫芦画瓢,来创建一下tea类
总结
在上面栗子中,Drunk.prototype.init,就是所谓的模版方法。
因为方法中封装了子类的算法框架,它作为一个算法的模版,指导子类以何种顺序去执行哪些方法。在Drunk.prototype.init方法中,算法内的每一个步骤都是清楚展现在我们眼前的。