• 主页
  • 随笔
所有文章 友链 关于我

  • 主页
  • 随笔

设计模式系列之十三代理模式

2016-12-25

  代理模式可以理解为通过一个中间者来访问数据,比如我们通过代理来访问互联网,通过代理商购买游戏点卡等。这些都属于代理模式的设计思想。

  上图为代理模式的一般数据交互逻辑。在Java后台开发中,使用RMI调用远程数据既采用了代理模式。

  在我的实际开发中,以个人开发经验,使用代理模式最主要是为了解决如下两个问题:

  1. 封装访问远程数据的具体实现逻辑。即客户端只需调用Proxy提供的方法即可,不关心数据从哪里取,本地or远程。
  2. 提供一个统一的口径实现过滤。

  下面分享一个使用到代理模式设计思想的代码样例。需求是这样的,前后端分离,前端统一使用$.ajax来请求后端提供的RESTFULL服务。需要在框架层面做到系统级的异常处理,即开发人员不需再关心系统级的异常,只需要关注业务逻辑。
  针对于该需求,明显是需要一个Proxy,通过一个Proxy来转发前后端的交互。或者说叫做数据请求过滤器的东西,来劫持所有的前端数据请求。最终的实现样例代码如下所示。

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
(function(){

//ajax方法clone
var _ajax = $.ajax;

//这里相当于劫持了原生的$.ajax方法,通过劫持实现对请求的过滤,系统级异常的捕获
$.ajax = function(param) {
//ajax deferred promise 保持原有promise操作
var promise;

var _param = $.extend({}, {autoWrap : true}, param);

//如果不需要默认的封装:autoWrap = false;
if (!_param.autoWrap) {
promise = _ajax(_param);
//直接返回
return promise;
}

//default ajax options
var defaultOpts = {
type: "POST",
dataType: "json",
cache: false,
headers: {
"CSRFToken" : getCSRFToken()
}
};
//deep extend
_param = $.extend(true, defaultOpts, _param);

//add timestamp
if (!_param.cache) {
var _url = _param.url || "";
var stamp = "T="+ new Date().getTime();
(_url.indexOf("?") == -1) ?( _url += "?"+stamp):( _url += "&"+stamp);
_param.url = _url;
}

if (_param.success) {
_param.callback = _param.success;
delete _param.success;
}

promise = _ajax($.extend({
success:function(response){
var code = response.status || response.code || "200";
//如果是整形,转换为字符串
typeof(code)=="number" && (code=code+"");
//状态码控制
switch(code){
case "200":
//数据转发
if (_param.callback) {
_param.callback(response);
}
break;
case "401":
//需要认证:登录超时或未登录.Session超时,弹出登陆框,登录成功后继续业务逻辑。
ReLogin(function(){
$.ajax(param);
});
break;
case "400":
alert("请求异常!");
break;
case "403":
alert("请求的资源未授权!");
break;
case "500":
alert("<code>500:</code>服务器端异常,请联系管理员.<br/>"+(response.msg || response.message));
break;
default :
alert("<code>"+code+":</code>服务器端异常,请联系管理员.<br/>"+(response.msg || response.message));
}
},
error:function(XMLHttpRequest, textStatus, errorThrown){
console.log("ajax error:" + textStatus);
}
}, _param));

return promise;
};
})();

上一篇:设计模式系列之十二状态模式

赏

谢谢你请我吃糖果

  • 设计模式

扫一扫,分享到微信

微信分享二维码
解决正确配置Servlet async-supported参数报错问题
设计模式系列之十二状态模式
© 2025 YiYing
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • 读书笔记
  • sql注入
  • sqlmap
  • nexus
  • HTTP安全
  • restfull
  • 随笔
  • 哲学
  • 缓存
  • HTTP状态码
  • HTTP连接
  • RSA
  • Java
  • JavaScript
  • 安全
  • 排序算法
  • POI
  • 工具类
  • 工作思考
  • Life
  • 读书
  • 前端
  • 团队管理

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 友情链接1
  • 友情链接2
  • 友情链接3
  • 友情链接4
  • 友情链接5
  • 友情链接6
很惭愧

只做了一点微小的工作
谢谢大家