基于参数,函数应该从更多100个json中选择一个json文件并向其他系统发出查询。
有数百个查询。
显然,如果不这样,那么开关就不会变得易于管理。我在javascript中查看了策略模式。
var queryCode = req.param('queryCode');
if(queryCode == 'x'){
//do something
} else if( queryCode == 'y'){
//do something
} else if( queryCode == 'z') {
//do something
}
// do something
有时会变大......
所以我想用战略模式取代它。哪个是最好的设计。
提前感谢您对此问题的任何建议。
答案 0 :(得分:4)
首先,如果/其他链是邪恶的,你的关注真的很好。
如果你有一些不同的行为 - 可能很长,也许是不相关的 - 你必须根据一些变量值在运行时选择一个行为,创建一个很棒的if else列表是没有意义的。这很难维护,引入风险,很可能也是在同一个类中混合责任,添加新行为是脏的(可以破坏旧事物并暗示修改已经测试的类,为已经工作的类添加新的不同职责)和许多其他原因。
你已经正确地提到了Strategy模式。这将是更适合您的问题的那个。您还可以查看Command模式,但一般概念将是相同的:将不同的行为封装在不同的类中。
然后,您可以使用Factory来检索要使用的正确策略。
简而言之,您将拥有一堆策略类,所有实现方法,让我们说execute
// strategyA.js
function StrategyA(){
}
StrategyA.prototype = {
execute: function() {
//custom behavior here
}
}
module.exports = StrategyA;
// strategyB.js
function StrategyB(){
}
StrategyB.prototype = {
execute: function() {
//custom behavior here
}
}
module.exports = StrategyB;
然后创建工厂类,根据参数创建正确的类。理想情况下,映射值 - >类将位于confing文件上,然后将其注册到工厂类,但为简单起见,您可以在同一文件中对其进行硬编码。像这样:
// factory.js
var StrategyA = require('./strategyA.js'),
StrategyB = require('./strategyB.js');
var _ = require('underscore');//asuming you have underscore
module.exports = function () {
var serviceDescriptions: [
{ name: 'a', service: StrategyA},
{name: 'b', service: StrategyB}
];
var getStrategy: function (name) {
//asuming you have underscore, otherwise, just iterate the array to look for the proper service
return _.find(this.serviceDescriptions, {name: name}).service;
};
}
有了这一切,首发更加复杂,但特别是如果你有很多不同的策略,或者将来必须增加更多,那将是一个很好的中期投资。而你的主要代码就是这样简单:
var Factory = require("factory.js");
...
var queryCode = req.param('queryCode');
var strategy = Factory.getStrategy(queryCode);
strategy.execute()
所以,无论你有多少不同的行为,或者它们有多长或多复杂或不同,你的主要课程总是看起来一样,简单易懂。