设计模式之工厂模式使用

实际应用:
接口解耦(快速更换框架,不用改动太多代码)
示例:更换网络请求框架
来自:https://v1sk.github.io/archives/
思路:

1.把http请求框架的共性方法抽取到接口中,我们把这个接口称为“请求接口”;
2.创建一个用于返回请求结果的接口,我们把这个接口称为“回调接口”;
3.分别用Volley和OkHttp实现“请求接口”;
4.创建一个类来返回上述接口的对象,我们把这个类叫做“工厂”类;
5.在Activity/Fragment/Presenter中,使用“工厂”返回的这个接口对象调用get/post/put/delete方法,并在“回调接口”中得到请求结果。

代码
1.把http请求框架的共性方法抽取到接口中

/*
 * 此接口提供的就是http请求通用的方法,该接口可以用Volley来实现,也能用OkHttp等其它方式来实现
 * 接口说明:
 *  get方法参数包含一个url,以及返回数据的接口
 *  post/put/delete方法还需要提供一个请求体参数
 */
public interface IRequestManager {
    void get(String url, IRequestCallback requestCallback);
    void post(String url, String requestBodyJson, IRequestCallback requestCallback);
    void put(String url, String requestBodyJson, IRequestCallback requestCallback);
    void delete(String url, String requestBodyJson, IRequestCallback requestCallback);
}

上面的IRequestManager接口中用到的请求结果回调接口——IRequestCallback

/**
 * Created by chenjianwei on 2016/12/11.
 * 请求返回成功/失败,成功时,把服务器返回的结果回调出去,失败时回调异常信息
 * onSuccess中的参数类型,当然也可以为JSONObject,这里只是举个栗子,可按照实际需求变通
 */
public interface IRequestCallback {
    void onSuccess(String response);
    void onFailure(Throwable throwable);
}

VolleyRequestManager

public class VolleyRequestManager implements IRequestManager {
    ...
    @Override
    public void get(String url, final IRequestCallback requestCallback) {
        StringRequest request = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        requestCallback.onSuccess(s);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        requestCallback.onFailure(volleyError);
                    }
                });
        HttpRequestExampleApp.mQueue.add(request);
    }
    @Override
    public void post(String url, String requestBodyJson, final IRequestCallback requestCallback) {
        requestWithBody(url, requestBodyJson, requestCallback, Request.Method.POST);
    }
    @Override
    public void put(String url, String requestBodyJson, final IRequestCallback requestCallback) {
        requestWithBody(url, requestBodyJson, requestCallback, Request.Method.PUT);
    }
    @Override
    public void delete(String url, String requestBodyJson, final IRequestCallback requestCallback) {
        requestWithBody(url, requestBodyJson, requestCallback, Request.Method.DELETE);
    }
    ...
}

工厂类RequestFactory

/*
 * 该类的作用是用于返回一个IRequestManager对象,这个IRequestManager的实现类
 * 可以是使用Volley实现的http请求对象,也可以是OkHttp实现的http请求对象
 * Activity/Fragment/Presenter中,只要调用getRequestManager()方法就能得到
 * http请求的操作接口,而不用关心具体是使用什么实现的。
 */
public class RequestFactory {

    public static IRequestManager getRequestManager(){
        return VolleyRequestManager.getInstance();
        //return OkHttpRequestManager.getInstance();
    }

}

使用RequestFactory的方式在Activity/Fragment/Presenter中创建对象,代码只依赖了IRequestManager这个接口,这就是使用接口进行解耦的关键点,无论在什么地方使用了这个接口,当要更换实现的时候,只需要修改RequestFactory中return的实现类就可以了。

测试代码

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //请求测试url
        String url = "https://api.douban.com/v2/movie/top250";
        //这里发起请求依赖的是IRequestManager接口,而没有具体实现类代码出现在这里
        IRequestManager requestManager = RequestFactory.getRequestManager();
        //调用接口的get方法
        requestManager.get(url, new IRequestCallback() {
            @Override
            public void onSuccess(String response) {
                Log.d(TAG, "onSuccess: " + response);
                 TODO: 2016/12/11 your code
            }

            @Override
            public void onFailure(Throwable throwable) {
                throwable.printStackTrace();
                 TODO: 2016/12/11 your code
            }
        });

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值