模板方法模式
定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。
模板方法模式是编程中经常用到的模式,其非常简单,AbstractClass叫抽象模板,其方法分为3类:
1.抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
2.模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
3.钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
实现类用来实现细节。抽象类中的模版方法正是通过实现类扩展的方法来完成业务逻辑。
模板方法模式优点
1.容易扩展。一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。
2.便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法。
适用场景
在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。
代码
//模板方法
var DP = require("./DesignPattern.js");
var AbstractCheck = (function () {
_check = function () {
this.startup();
this.speeup();
this.checkspeed();
this.brake();
this.stop();
}
return function AbstractCheck() {
DP.Interface(this, ['startup', 'speeup', 'brake', 'stop']);
this.checkspeed = function () {
console.log("默认不检测速度");
};
this.check = _check;
}
})();
function Porsche911() {
this.__proto__ = new AbstractCheck();
this.startup = function () {
console.log("检测911启动");
};
this.speeup = function () {
console.log("检测911加速");
};
this.brake = function () {
console.log("检测911刹车");
//检测方法标准
console.log("911刹车合格");
};
this.stop = function () {
console.log("检测911熄火");
}
}
function Porsche781() {
this.__proto__ = new AbstractCheck();
this.startup = function () {
console.log("检测781启动");
};
this.speeup = function () {
console.log("检测781加速");
};
this.brake = function () {
console.log("检测781刹车");
//检测方法标准
console.log("781刹车合格");
};
this.stop = function () {
console.log("检测781熄火");
};
this.checkspeed = function () {
console.log("检测781速度");
};
}
var porsche911 = new Porsche911();
var porsche781 = new Porsche781();
porsche911.check();
porsche781.check();