美文网首页Java学习笔记程序员
设计模式系列之十三代理模式

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

作者: 梦中人在梦中 | 来源:发表于2016-12-25 18:21 被阅读55次

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

Proxy

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

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

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

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

(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;
    };
})();

上一篇:<a href="http://muchstudy.com/2016/12/24/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B3%BB%E5%88%97%E4%B9%8B%E5%8D%81%E4%BA%8C%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/">设计模式系列之十二状态模式</a>

相关文章

  • Android 代理模式

    Android 设计模式系列文章 Android 23种设计模式 前言 代理模式可能是我们平时开发中最常见的模式之...

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

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

  • Java设计模式系列-代理模式

    原创文章,转载请标注出处:《Java设计模式系列-代理模式》 一、概述 代理模式算是我接触较早的模式,代理就是中介...

  • Android 设计模式之简单工厂模式

    设计模式系列文章 Android 设计模式之单例模式 Android 设计模式之Builder模式 Android...

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • 设计模式系列之「代理模式」

    前言 在移动开发行业中,每隔一段时间都会出现新的技术,很多人都会感叹跟不上新技术,对于这个问题,小Y个人觉得,抓不...

  • iOS设计模式(三)之抽象工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(一)之简单工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(二)之工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • 代理模式

    设计模式之代理模式 什么是代理模式? 指的事代理对象为其他对象提供代理以控制对被...

网友评论

    本文标题:设计模式系列之十三代理模式

    本文链接:https://www.haomeiwen.com/subject/xcldvttx.html