fre*_*erz 5 javascript design-patterns if-statement strategy-pattern node.js
根据参数,函数应从 100 个 json 中选择一个 json 文件并向其他系统发出查询。
会有数百个查询。
显然, if else 和 switch 将无法管理。我在 javascript 中寻找了策略模式。
var queryCode = req.param('queryCode');
if(queryCode == 'x'){
//do something
} else if( queryCode == 'y'){
//do something
} else if( queryCode == 'z') {
//do something
}
Run Code Online (Sandbox Code Playgroud)
// do something有时可能会变大......
所以我想用策略模式替换它。这将是最好的设计。预先感谢您对此问题的任何建议。
首先,如果/else 链是邪恶的,您的关注真的很好。
当您有一些不同的行为 - 可能很长,也可能不相关 - 并且您必须在运行时根据某个变量值选择一个,创建一个很好的 if else 列表是没有意义的。这将难以维护,引入风险,很可能也是在同一个类中混合职责,添加新行为是肮脏的(可以打破旧事物并暗示修改已经测试过的类,向已经工作的类添加新的不同职责)和许多其他原因。
您提到策略模式已经是正确的。这将是更适合您的问题的那个。您还可以查看命令 模式,但一般概念是相同的:将不同的行为封装在不同的类中。
然后您可以使用工厂来检索要使用的正确策略。
简而言之,你将有一堆策略类,都实现了一个方法,让我们说 execute
//策略A.js
function StrategyA(){
}
StrategyA.prototype = {
execute: function() {
//custom behavior here
}
}
module.exports = StrategyA;
Run Code Online (Sandbox Code Playgroud)
//策略B.js
function StrategyB(){
}
StrategyB.prototype = {
execute: function() {
//custom behavior here
}
}
module.exports = StrategyB;
Run Code Online (Sandbox Code Playgroud)
然后创建工厂类,根据参数创建正确的类。理想情况下,映射 value->class 将位于配置文件中,然后将其注册到工厂类,但为简单起见,您可以将其硬编码在同一文件中。像这样的东西:
//工厂.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;
};
}
Run Code Online (Sandbox Code Playgroud)
有了这一切,开始就更复杂了,但特别是如果你有很多不同的策略,或者将来必须增加更多,那么中期投资将是一个很好的投资。您的主要代码将非常简单:
var Factory = require("factory.js");
...
var queryCode = req.param('queryCode');
var strategy = Factory.getStrategy(queryCode);
strategy.execute()
Run Code Online (Sandbox Code Playgroud)
因此,无论您有多少不同的行为,或者它们有多长、多复杂或多不同,您的主类将始终看起来相同、简单且易于遵循。
| 归档时间: |
|
| 查看次数: |
3786 次 |
| 最近记录: |