在我的qooxdoo应用程序中,我有4个按钮。登录,注销,注册和个人资料。每个按钮都有一个动作类。这些类是从一个公共抽象类中继承而来的。通过使用命令模式,每次单击按钮时,我都会调用相应类的执行函数。该函数看起来像这样
execute: function() {
var contentString = "login-form";
//do some generic stuff
if (win.getContentString() === contentString) {
//do some generic stuff
} else {
var content = new myapp.apps.userActions.SLoginForm();
//do some more generic stuff
}
}
执行函数必须在所有4个子类中实现,唯一改变的是变量content和contentString。
我正在考虑使用工厂函数,并且每次都根据contentString变量返回相应的对象。
execute:function(){
var contentString = "login-form";
this.doTheGenericStuff(contentString);
},
doTheGenericStuff: function(contentString){
//do the generic stuff
var content = this.getTheObject(contentString);
//do some more generic stuff
},
getTheObject: function(contentString){
switch(contentString){
case "login-form":
return new myapp.apps.userActions.SLoginForm();
break;
case "register-form":
return new myapp.apps.userActions.SRegisterForm();
break;
//etc
}
}
虽然这看起来还不错(尚未经过测试)我不喜欢它,因为每次添加新动作时我都必须更新工厂功能。有没有更聪明的方法来实现这一目标?也许我不知道的一些javascript功能?
答案 0 :(得分:1)
小问题,但如果您已经有break
语句,则不需要为每个case
添加return
语句,因为这足以存在switch
1}}。
您可以传递一个额外的参数,并使用它来使用括号表示法而不是点表示法来调用构造函数。
execute:function(){
var contentString = "login-form";
var objectType = "SLoginForm";
this.doTheGenericStuff(contentString, objectType);
},
doTheGenericStuff: function(contentString, objectType){
//do the generic stuff
var content = this.getTheObject(objectType);
//do some more generic stuff
},
getTheObject: function(objectType){
return new myapp.apps.userActions[objectType]();
}
答案 1 :(得分:1)
我认为在这种情况下使用template method pattern会更合适。
所以在你的抽象课上你有:
getMyContentString: function() { return "login-form"; //or any default value },
getMyContent: function() { return new myapp.apps.userActions.SLoginForm() },
execute: function() {
var contentString = getMyContentString(); // to be overridden
//do some generic stuff
if (win.getContentString() === contentString) {
//do some generic stuff
} else {
var content = getMyContent();
//do some more generic stuff
}
}
每个子对象只需提供适当的getMyContentString()
和getMyContent()