我想用javascript实现模板方法模式。
我有一个带有一些子类的PropertyDecorator : OpenButtonDecorator、SeeButtonDecorator等。我希望在属性装饰器中有下一个函数:
var build = function(){
decorate(); //Abstract in PropertyDecorator, defined in subclasses
return le.build();
}我怎样才能让这个场景工作呢?也许我实现了错误的继承:S (对此也有帮助:)
提前谢谢你。
发布于 2011-02-10 20:04:53
Javascript是一种动态类型的、基于原型的语言。模板方法是一种设计模式,因此独立于语言,但其实现可能因语言而异。
对于javascript,以及其他动态类型的语言,比如ruby,抽象类和接口没有多大意义,因为动态链接是通过委托发生的。(方法调用被传播到继承树中的更高级别,直到原型可以处理该请求)。这与鸭子类型相结合,意味着任何方法都可能在任何实例上被调用,从而避免了对显式约定的需要,在基于类的语言中,显式约定是由在特定类型上可见的那些声明的方法定义的。
因此,为了实现该模式,只需在父类的原型构建方法(该方法将是模板)上调用一个不存在的方法,并在子类上简单地实现该方法:
function PropertyDecorator()
{
this.build = function()
{
var decoration=this.decorate();
return "The decoration I did: "+decoration;
};
}
//we set the parent (those prototype that instances of this class will delegate calls to)
OpenButtonDecorator.prototype = new PropertyDecorator();
function OpenButtonDecorator()
{
this.decorate = function()
{
return "open button";
};
}
SeeButtonDecorator.prototype = new PropertyDecorator();
function SeeButtonDecorator()
{
this.decorate = function()
{
return "see button";
};
}
var decorators=Array(new SeeButtonDecorator(),new OpenButtonDecorator());
for (var decorator in decorators){
document.writeln(decorators[decorator].build());
}方法分派是这样发生的:
中接收调用的对象)的上下文中执行方法主体
因此,当调用新的SeeButtonDecorator().build()时,它首先会尝试在实例上执行build方法。由于它没有在实例中定义,方法调用将被委托给实例父实例,在本例中,实例父实例的SeeButtonDecorator原型也没有获得该方法,因此它将把调用委托给它的父实例(PropertyDecorator)。PropertyDecorator,具有build()方法。
function PropertyDecorator()
{
this.build = function()
{
var decoration=this.decorate();
return "The decoration I did: "+decoration;
};
}在执行它时,将在新的SeeButtonDecorator()上下文中计算build方法的主体。实例本身没有decorate()方法,因为它是在SeeButtonDecorator()函数(其原型)中定义的。好吧,这一次调用将被委托给实例原型,它最终将获得一个修饰符()方法:
function SeeButtonDecorator()
{
this.decorate = function()
{
return "see button";
};
}该方法将在实例的上下文中再次执行,并将返回字符串,在调用堆栈中回退,直到返回
The decoration I did: see buttonhttps://stackoverflow.com/questions/3891861
复制相似问题