模板方法定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具体体现是面向对象编程编程语言里的抽象类(以及其中的抽象方法),以及继承该抽象类(和抽象方法)的子类。
案例:我有一系列的活动,比如满减、满赠、包邮等活动,在执行活动前后有一些逻辑需要处理,我们可以将这些逻辑封装的父类中,活动类只需要处理当前活动的逻辑即可
活动基类:
var ActiveBase=function(){ this.resultPrice=0; }; ActiveBase.prototype.checkProductPrice=function(){ console.info("检查产品价格"); }; ActiveBase.prototype.checkProductCount=function(){ console.info("检查产品数量"); }; ActiveBase.prototype.isExecute=function(){/*是否执行活动,可以重写*/ return true; }; ActiveBase.prototype.activeRule=function(){/*活动规则,必须重写*/ console.info("该方法必须重写"); }; ActiveBase.prototype.execute=function(){/*执行活动*/ console.info("开始执行活动"); this.checkProductPrice(); this.checkProductCount(); if (this.isExecute()) { this.activeRule(); } };
优惠券活动:
var CouponActive=function(){ ActiveBase.apply(this); }; CouponActive.prototype = new ActiveBase(); CouponActive.prototype.activeRule = function(){ console.info("======执行活动======="); this.resultPrice=20; }; CouponActive.prototype.isExecute=function(){return true;};
客户端:
var couponActive = new CouponActive(); couponActive.execute(); console.info("价格:"+couponActive.resultPrice);
控制台输出:
开始执行活动 检查产品价格 检查产品数量 ======执行活动======= 价格:20