首页 > 其他分享 >代理模式实现隔离层架构,自由切换三方网络请求框架

代理模式实现隔离层架构,自由切换三方网络请求框架

时间:2023-06-19 10:36:14浏览次数:43  
标签:三方 架构 String void params Override new public 隔离


使用代理模式实现隔离层架构,目的是为了当出现一个新的网络框架的时候,可以在业务层无感的情况下自由切换网络库,实现热插拔,对业务层几乎没有影响。

1 架构图

以用户租房为例,租户相当于APP的业务层;一个用户会对比多套房子,所以会有多个房东,最终提供房源的是房东,所以房东就类似最终实现网络请求的网络库。

中介公司和中介属于隔离层,用户租房不直接和房东打交道,只和中介联系,至于中介和哪个房东沟通,用户无需关心,只要租到房子就行,所以中介就相当于一个中间代理。

代理模式实现隔离层架构,自由切换三方网络请求框架_java

2 类图

代理模式实现隔离层架构,自由切换三方网络请求框架_架构_02

3 类图和架构图以及代码中的类相结合

代理模式实现隔离层架构,自由切换三方网络请求框架_架构_03

4 代码

网络请求的结果需要回调给业务层,所以先要创建一个回调接口。

public interface ICallback {
    void onSuccess(String result);

    void onFailure(String error);
}

实现回调接口,把指定的的泛型JavaBean用反射的方法解析出来。然后把json转换为JavaBean回调出去。

public abstract class HttpCallback<Result> implements ICallback {

    private static final String TAG = "HttpCallback";

    @Override
    public void onSuccess(String result) {
        //获取对应的JavaBean
        Class<?> clazz = parseClassInfo(this);
        Result objResult = (Result) new Gson().fromJson(result, clazz);
        onSuccess(objResult);
    }

    public abstract void onSuccess(Result objResult);

    @Override
    public void onFailure(String error) {

    }

    private Class<?> parseClassInfo(Object object) {
        //获得导游泛型的父类
        Type type = object.getClass().getGenericSuperclass();
        Log.d(TAG, "parseClassInfo 1: "+type);
        //获取参数化类型的数组
        Type[] params = ((ParameterizedType) type).getActualTypeArguments();
        Log.d(TAG, "parseClassInfo 2: "+params.toString());
        //拿到泛型,而HttpCallback<Result>只有一个,所以取0即可得到传入的JavaBean
        return (Class<?>) params[0];
    }
}

然后创建一个接口主题类,也就是中介公司,中介公司只制定标准和规则,具体业务由自己公司的中介去处理。

public interface IHttpRequest {
    void post(String url, Map<String, Object> params, ICallback callback);

    void get(String url, ICallback callback);
}

创建代理类,也就是中介。

public class HttpHelper implements IHttpRequest {

    private static HttpHelper instance;

    public static HttpHelper obtain() {
        synchronized (HttpHelper.class) {
            if (instance == null) {
                instance = new HttpHelper();
            }
        }
        return instance;
    }

    private HttpHelper() {
    }

    private static IHttpRequest mHttpRequest;

    public static void init(IHttpRequest httpRequest) {
        mHttpRequest = httpRequest;
    }

    @Override
    public void post(String url, Map<String, Object> params, ICallback callback) {
        String finalUrl = appendParams(url, params);
        mHttpRequest.post(finalUrl, params, callback);
    }

    @Override
    public void get(String url, ICallback callback) {
        mHttpRequest.get(url, callback);
    }

    public static String appendParams(String url, Map<String, Object> params) {
        if (params == null || params.isEmpty()) {
            return url;
        }

        StringBuilder urlBuilder = new StringBuilder(url);
        if (urlBuilder.indexOf("?") <= 0) {
            urlBuilder.append("?");
        } else {
            if (!urlBuilder.toString().endsWith("?")) {
                urlBuilder.append("&");
            }
        }
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            urlBuilder.append("&" + entry.getKey())
                    .append("=")
                    .append(encode(entry.getValue().toString()));
        }
        return urlBuilder.toString();
    }

    private static String encode(String str) {
        try {
            return URLEncoder.encode(str, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
}

创建一个类OkHttpRequest去具体实现网络请求,也就是房东,房东可以是多个,所以还可以有VolleyHttpRequest、XUtilsHttpRequest、xxxHttpRequest等。

public class OkHttpRequest implements IHttpRequest {

    private OkHttpClient mOkHttpClient;
    private Handler myHandler; // 此Handler是为了切换到主线程用的,处理成果

    public OkHttpRequest() {
        mOkHttpClient = new OkHttpClient();
        myHandler = new Handler();
    }

    @Override
    public void post(String url, Map<String, Object> params, ICallback callback) {
        final RequestBody requestBody = appendBody(params);
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String result = response.body().string();
                if (response.isSuccessful()) {
                    myHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess(result);
                        }
                    });
                } else {
                    myHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onFailure(result);
                        }
                    });
                }
            }

            @Override
            public void onFailure(Call call, IOException e) {
                myHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onFailure("onFailure");
                    }
                });
            }
        });
    }

    @Override
    public void get(String url, ICallback callback) {
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String result = response.body().string();
                if (response.isSuccessful()) {
                    myHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess(result);
                        }
                    });
                } else {
                    myHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onFailure(result);
                        }
                    });
                }
            }

            @Override
            public void onFailure(Call call, IOException e) {
                myHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onFailure("onFailure");
                    }
                });
            }
        });
    }

    // 就是为了post请求的, 参数组装
    private RequestBody appendBody(Map<String, Object> params) {
        FormBody.Builder body = new FormBody.Builder();
        if (params == null || params.isEmpty()) {
            return body.build();
        }
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            body.add(entry.getKey(), entry.getValue().toString());
        }
        return body.build();
    }
}

创建一个响应结构。

public class ResponseData {
    private String result;
    private String reason;
    private int error_code;
    private String resultcode;

    public void setResult(String result) {
        this.result = result;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public void setError_code(int error_code) {
        this.error_code = error_code;
    }

    public void setResultcode(String resultcode) {
        this.resultcode = resultcode;
    }

    public String getResult() {
        return result;
    }

    public String getReason() {
        return reason;
    }

    public int getError_code() {
        return error_code;
    }

    public String getResultcode() {
        return resultcode;
    }

    @Override
    public String toString() {
        return "ResponseData{" +
                "result='" + result + ''' +
                ", reason='" + reason + ''' +
                ", error_code=" + error_code +
                ", resultcode='" + resultcode + ''' +
                '}';
    }
}

初始化,指定网络请求库。

public class MainApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在这里切换其他HttpRequest,即可实现自由切换网络请求库。
        HttpHelper.init(new OkHttpRequest());
//        HttpHelper.init(new VolleyRequest(this));
//        HttpHelper.init(new XUtilsRequest(this));
    }
}

业务层使用。

String url = "https://www.baidu.com";
HashMap<String, Object> params = new HashMap<>();
params.put("param1", "1");
params.put("param2", "2");

HttpHelper.obtain().post(url, params, new HttpCallback<ResponseData>() {
       @Override
       public void onSuccess(ResponseData objResult) {
              Toast.makeText(MainActivity.this, objResult.toString(), Toast.LENGTH_SHORT).show();
        }
});


标签:三方,架构,String,void,params,Override,new,public,隔离
From: https://blog.51cto.com/u_16163480/6511299

相关文章

  • 阿里P7架构师整理:最新Android 开发源码精编内核解析
    做Android开发多年,我们都深知阅读源码的重要性,阅读源码可以帮助我们:①在通用型基础技术中提高技术能力,凸显出自己的技术实力;②在重点领域打造自己的亮点,参与技术栈的运维,积累丰富的使用经验,成为团队的核心骨干;③从优秀的源码中学习设计模式的应用,和有用的编码技巧。但是平时读源码......
  • 浅谈生活中常见的三大应用程序架构(PE、ELF、Mach-O)、五大操作系统(windows、linux、mac
    ·今天不聊复杂的技术,就是想做一下科普。我们生活中常见的操作系统,大致有5种分别是 电脑: Windows linux    macos手机 androidiosWindows手机操作系统没有发展起来,不同的操作系统间软件不能......
  • LINUX LAMP架构
    目录一、LAMP二、Apache三、MySQL四、PHP  一、LAMP1.概念LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整台系统和相关软件,能够提供动态web站点服务及其应用开发环境2.组成在构建LAMP平台时,各组件的安装顺序依次为Linux,Apac......
  • C/S 架构
    中文名:客户机-服务器英文名:Client-Server定义:客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。......
  • Python第三方模块:pymongo模块的用法
    pymongo模块是python操作mongo数据的第三方模块,记录一下常用到的简单用法。首先需要连接数据库:MongoClient():该方法第一个参数是数据库所在地址,第二个参数是数据库所在的端口号authenticate():该方法第一个参数是数据库的账号,第二个参数是数据库的密码frompymongoimpor......
  • 系统架构设计师笔记第18期:NoSQL数据库
    NoSQL数据库通常指非关系型数据库,是一种基于数据键值对存储、高度分布式、支持动态查询的数据管理系统。NoSQL数据库的设计目的是为了解决传统关系型数据库无法处理的大型应用程序的数据存储和管理问题。它们通常具有以下特点:灵活性:NoSQL数据库没有固定的表结构和查询语言,允许在......
  • 系统架构师-UML相关图
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址基本概念在UML(统一建模语言)中,常见的九种图包括:类图(ClassDiagram):展示系统中的类、接口、关系和属性等静态结构。对象图(ObjectDiagram):展示系统中对象的实例和对象之间的关系。用例图(UseCaseDiagram):描述系统的功能需求,显示参......
  • 系统架构师-UML相关图
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址基本概念在UML(统一建模语言)中,常见的九种图包括:类图(ClassDiagram):展示系统中的类、接口、关系和属性等静态结构。对象图(ObjectDiagram):展示系统中对象的实例和对象之间的关系。用例图(UseCaseDiagram):描述系统的......
  • 架构演变过程
    单体架构分布式架构:业务拆分微服务分布式架构的一种。独立开发和部署,一个业务多个服务支持特点:单一职责:拆分粒度更小,一个服务一个业务,避免重复开发(面向对象角度来说符合最少知道原则,干相同事情的放在一起,结构清晰)自治:团队独立(符合敏捷开发)、技术独立(各个服务可以选择不同的技术)......
  • 1、Android中MVC、MVP和MVVM架构模式的区别
    架构模式为项目文件提供了模块化,并确保所有的代码在单元测试中得到覆盖。它使开发人员很容易维护软件,并在未来扩展应用程序的功能。MVC(模型-视图-控制器)、MVP(模型-视图-展示者)和MVVM(模型-视图-视图模型)是开发人员中最流行和行业公认的安卓架构模式。模型-视图-控制器(MVC)模......