学习JavaScript设计模式之模板方法模式
一、定义
模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。java中的抽象父类、子类
模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。
二、示例
CoffeeorTea
(1)把水煮沸
(2)用沸水浸泡茶叶
(3)把茶水倒进杯子
(4)加柠檬
/*抽象父类:饮料*/
varBeverage=function(){};
//(1)把水煮沸
Beverage.prototype.boilWater=function(){
console.log("把水煮沸");
};
//(2)沸水浸泡
Beverage.prototype.brew=function(){
thrownewError("子类必须重写brew方法");
};
//(3)倒进杯子
Beverage.prototype.pourInCup=function(){
thrownewError("子类必须重写pourInCup方法");
};
//(4)加调料
Beverage.prototype.addCondiments=function(){
thrownewError("子类必须重写addCondiments方法");
};
/*模板方法*/
Beverage.prototype.init=function(){
this.boilWater();
this.brew();
this.pourInCup();
this.addCondiments();
}
/*实现子类Coffee*/
varCoffee=function(){};
Coffee.prototype=newBeverage();
//重写非公有方法
Coffee.prototype.brew=function(){
console.log("用沸水冲泡咖啡");
};
Coffee.prototype.pourInCup=function(){
console.log("把咖啡倒进杯子");
};
Coffee.prototype.addCondiments=function(){
console.log("加牛奶");
};
varcoffee=newCoffee();
coffee.init();
通过模板方法模式,在父类中封装了子类的算法框架。这些算法框架在正常状态下是适用大多数子类的,但也会出现“个性”子类。
如上述流程,加调料是可选的。
钩子方法可以解决这个问题,放置钩子是隔离变化的一种常见手段。
/*添加钩子方法*/
Beverage.prototype.customerWantsCondiments=function(){
returntrue;
};
Beverage.prototype.init=function(){
this.boilWater();
this.brew();
this.pourInCup();
if(this.customerWantsCondiments()){
this.addCondiments();
}
}
/*实现子类Tea*/
varTea=function(){};
Tea.prototype=newBeverage();
//重写非公有方法
Tea.prototype.brew=function(){
console.log("用沸水冲泡茶");
};
Tea.prototype.pourInCup=function(){
console.log("把茶倒进杯子");
};
Tea.prototype.addCondiments=function(){
console.log("加牛奶");
};
Tea.prototype.customerWantsCondiments=function(){
returnwindow.confirm("需要添加调料吗?");
};
vartea=newTea();
tea.init();
JavaScript没有提供真正的类式继承,继承是通过对象与对象之间的委托来实现的。
三、“好莱坞原则”:别调用我们,我们会调用你
典型使用场景:
(1)模板方法模式:使用该设计模式意味着子类放弃了对自己的控制权,而是改为父类通知子类。作为子类,只负责提供一些设计上的细节。
(2)观察者模式:发布者把消息推送给订阅者。
(3)回调函数:ajax异步请求,把需要执行的操作封装在回调函数里,当数据返回后,这个回调函数才被执行。
希望本文所述对大家学习javascript程序设计有所帮助。