重构日记(1)——复用、抽象、工厂模式

关键思想

减少重复代码,方面多次使用

问题描述
由于我的项目需要多次和后台拿数据,之前已经使用了自己封装的Okhttp工具,但是还是要重复的写Callback的两个方法和生成Message对象


解决方法

重写Callback接口,把重复的onFailure方法复用,重复的消息对象操作复用
运用思想:减少重复代码、抽象

优化前

优化后

    private void getGateList() {
        String url = Constant.GET_GATELIST + Constant.account;
        OkhttpUtil.doGetJsonObject(url, new MyCallback(GET_LIST_OK) {
            @Override
            public void sendMsg(Message msg) {
                super.sendMsg(msg);
                mHandler.sendMessage(msg);
            }
        });
    }

怎么样是不是简单了很多,要自己打的代码也变少了.然后自己需要获取数据成功返回什么数据(GET_LIST_OK=1)也可以在new的时候传入,对我自己来说真的是非常好用了

下面来看看重写的这个Callback,使用时有特殊需求可以随时重写

public class MyCallback implements Callback {
    private Message msg = new Message();
    private int what;

    public MyCallback() {

    }

    public MyCallback(int what) {
        this.what = what;
    }

    @Override
    public void onFailure(Call call, IOException e) {
        msg.what = -1;
        msg.obj = "服务器异常";
        sendMsg(msg);
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        String json = response.body().string();
        msg.what = what;
        msg.obj = json;
        sendMsg(msg);
    }

    /**
     * 用来获取Msg发消息给Handler的
     *
     * @param msg
     */
    public void sendMsg(Message msg) {
        this.msg = msg;
    }

}

工厂模式实例——DialogFactory

问题描述
经常要用Dialog,但是种类又不同
有些有view、有些没有
有些比较复杂,有些直接连后台


解决方法

决定采用工厂模式
一个Dialog工厂生产各种我需要的Dialog

1.实现方法接口
你想要你的所有Dialog都会的操作

public interface ShowDialog {
    public void show();

}

2.接口的实现类

关键是show方法可以把对话框弹出来并且按钮逻辑要实现好
顺便还用到了泛型保证删除后可以remove各种类型的List

public class DeleteDialog implements ShowDialog {
    private Activity context;
    private String url;
    private List<?> list;
    private int pos;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 200: {
                    context.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            ToastUtil.toast("删除成功!! ", context);
                            list.remove(pos);
                            gatewayAdapter.notifyDataChanged();
                        }
                    });
                    break;
                }
            }
        }
    };




    public DeleteDialog(Activity context, String url, List<?> list, int pos) {
        this.context = context;
        this.url = url;
        this.list = list;
        this.pos = pos;
    }

    @Override
    public void show() {
        /*
         * 简单实现可编辑对话框(方法内多行注释)
         */
        AlertDialog.Builder builder = new AlertDialog.Builder(context);

        builder.setTitle("确定要删除吗?:").setIcon(android.R.drawable.ic_dialog_info)
                .setNegativeButton("Cancel", null);
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                OkhttpUtil.doGetJsonObject(url, new MyCallback(200) {
                    @Override
                    public void sendMsg(Message msg) {
                        super.sendMsg(msg);
                        handler.sendMessage(msg);
                    }
                });
            }
        });
        builder.show();
    }

}

3.实现静态工厂类
使用这种工厂模式的好处就是不需要创建实例,直接调用即可。

public class DialogFactory {

    public static ShowDialog produceDeleteDialog(Activity context, String url, List<?> list, int pos) {
        return new DeleteDialog(context, url, list, pos);
    }

    public static ShowDialog produceAddGatewayDialog(Activity activity, List<DeviceManagerItem> deviceManagerItems) {
        return new AddGatewayDialog(activity,deviceManagerItems);
    }

}

4.实际使用

	 //参数按位置介绍
	 //用于在其他类更新UI、后台的删除接口、需要删除的List、需要删除的位置
     ShowDialog showDialog = DialogFactory.produceDeleteDialog(mContext, url, gatewayList, pos);
     showDialog.show();
	 
	 //生产第二种Dialog
	   ShowDialog showDialog=DialogFactory.produceAddGatewayDialog(getActivity(),deviceManagerItems);
      showDialog.show();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值