深入理解JavaScript系列(41):设计模式之模板方法详解
介绍
模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具体体现是面向对象编程编程语言里的抽象类(以及其中的抽象方法),以及继承该抽象类(和抽象方法)的子类。
正文
举个例子,泡茶和泡咖啡有同样的步骤,比如烧开水(boilWater)、冲泡(brew)、倒在杯子里(pourOnCup),加小料(addCondiments)等等。但每种饮料冲泡的方法以及所加的小料不一样,所以我们可以利用模板方法实现这个主要步骤。
首先先来定义抽象步骤:
varCaffeineBeverage=function(){
}; CaffeineBeverage.prototype.prepareRecipe=function(){ this.boilWater(); this.brew(); this.pourOnCup(); if(this.customerWantsCondiments()){ //如果可以想加小料,就加上 this.addCondiments(); } }; CaffeineBeverage.prototype.boilWater=function(){ console.log("将水烧开!"); }; CaffeineBeverage.prototype.pourOnCup=function(){ console.log("将饮料到再杯子里!"); }; CaffeineBeverage.prototype.brew=function(){ thrownewError("该方法必须重写!"); }; CaffeineBeverage.prototype.addCondiments=function(){ thrownewError("该方法必须重写!"); }; //默认加上小料 CaffeineBeverage.prototype.customerWantsCondiments=function(){ returntrue; };