Javascript中的策略模式

定义和好处

策略模式的定义是:
策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,让算法的变化不会影响到使用算法的客户。。
使用策略模式的好处如下:

  1. 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句。
  2. 策略模式提供了开放-封闭原则,使代码更容易理解和扩展。
  3. 策略模式中的代码可以复用。

为什么写这篇博客,这得从我最近遇到一个问题说起:
我要实现一个监控页面,这个监控页面采用的node.js + express + socket.io,监控数据是由后台提供的api接口提供,而且来自不同的地方,看下我的后台实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 获取流量数据
var http_get = function(host, option, callback){
var ret = {};
var http = require('http');
var qs = require('querystring');
var data = option || null;
var content = qs.stringify(data);

var options = {
hostname: host,
port: 80,
path: '/getData.php?' + content,
method: 'GET'
};

var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
callback(chunk);
});
});

req.on('error', function (e) {
});

req.end();
}

定时获取监控数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
setInterval(function(){
var params = {
name: 'key1'
};
http_get('192.168.1.1', params, function(obj){
socket.emit('key1', { data: obj});
});

params = {
name: 'key2'
};
http_get('192.168.1.2', params, function(obj){
socket.emit('key2', { data: obj});
});

params = {
name: 'key3'
};
http_get('192.168.1.3', params, function(obj){
socket.emit('key3', { data: obj});
});
...
}, 5000);

可以看到,随着需要监控的节点越来越多,我就要不停的添加执行代码。

利用Javascript版本的策略模式改造:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var nodes = {
"192.168.1.1": function(param) {
return http_get("192.168.1.1", param, function(obj){
socket.emit('key1', { data: obj});
});
},
"192.168.1.2" : function(param) {
return http_get("192.168.1.2", param, function(obj){
socket.emit('key2', { data: obj});
});
},
"192.168.1.3" : function(param) {
return http_get("192.168.1.3", param, function(obj){
socket.emit('key3', { data: obj});
});
}
};

感谢您的阅读,有不足之处请在评论为我指出!

参考资料

[1]:深入理解JavaScript系列(33):设计模式之策略模式
[2]:理解Javascript中的策略模式

版权声明:本文为博主原创文章,未经博主允许不得转载。本文地址 http://yangyuji.github.io/2015/06/24/javascript-strategy-pattern/