我正在构建一个具有" buildVisuals()"方法。根据具体情况," buildVisuals()"可以创建一个谷歌地图标记,或填写一个HTML模板,或未来我可能决定做的任何一些事情。但是,如果可视化在任何上下文中都可用,我希望它在创建时执行。
thing = function(){
var x, y, z;
this.buildVisuals();
}
...
new thing();
目前,我考虑将此方法留空,并强制使用它的上下文覆盖该方法,以便只有需要地图或其他任何内容的上下文才能拥有所需的功能,并且对于那些上下文不需要立即可视化,他们可以将其留空。
问题:我不知道这种模式叫什么,我不知道它是否比它的价值更麻烦。
答案 0 :(得分:2)
阅读你的问题时会想到两个想法:
您可以将buildVisuals方法视为abstract
/ virtual
/ mustInherit
方法。
// Abstract Base class
function Handler() {
this.visuals = this.buildVisuals();
}
Handler.prototype = {
doAThing : function() {
},
buildVisuals : function () {
throw('Error : buildVisuals was not overloaded');
}
};
// Real class inheriting from the base class
function HTMLHandler() {
Handler.call(this);
}
HTMLHandler.prototype = Object.create(Handler.prototype);
// overloading (defining) buildVisual
HTMLHandler.prototype.buildVisuals = function() {
// Real code here
};
// now you create with :
var myHandler = new HTMLHandler();
// notice that the following line would throw :
// var myThrowingHandler = new Handler();
但我更喜欢注射模式,我甚至更喜欢注射处理视觉的类。
// --------------
function Handler( visualHandlingClass ) {
this.visualHandler = new visualHandlingClass( /* maybe some params here */ );
}
Handler.prototype = { ... } ;
// --------------
function HTMLVisualHandler () {
// class constructor here...
}
HTMLVisualHandler.prototype = { ... } ;
// ---------------
var HandlerUsingHtml = new Handler ( HTMLVisualHandler ) ;
现在如果你想出于某种原因选择字符串,你可能想要使用工厂模式来获取你的实例,但是一个简单的帮助函数就足够了:
function provideHandler( outputKindString ) {
if (outputKindString == 'html') {
return new Handler ( HTMLVisualHandler ) ;
}
if ( .... )
}
var myHandler = provideHandler( 'html' );
答案 1 :(得分:0)