前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >责任链模式

责任链模式

作者头像
提莫队长
发布2019-02-21 13:37:39
6900
发布2019-02-21 13:37:39
举报
文章被收录于专栏:刘晓杰刘晓杰

1.定义

责任链模式是行为型设计模式之一,它使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

2.实战演练

用三个BroadcastReceiver来演示责任链事件处理 FirstReceiver (当limit==1000的时候获取msg打印并退出,否则添加一个新的msg给下一个Receicer)

代码语言:javascript
复制
public class FirstReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int limit = intent.getIntExtra("limit", -1001);
        if(limit == 1000){
            String msg = intent.getStringExtra("msg");
            Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
            abortBroadcast();
        } else {
            Bundle b = new Bundle();
            b.putString("new", "msg from FirstReceiver");
            setResultExtras(b);
        }
    }
}

SecondReceiver(当limit==100的时候获取msg和上一个reveicer添加的msg打印并退出,否则添加一个新的msg给下一个Receicer)

代码语言:javascript
复制
public class SecondReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int limit = intent.getIntExtra("limit", -1001);
        if(limit == 100){
            String msg = intent.getStringExtra("msg");

            Bundle b = getResultExtras(true);
            String str = b.getString("new");

            Toast.makeText(context, msg + str, Toast.LENGTH_SHORT).show();
            abortBroadcast();
        } else {
            Bundle b = new Bundle();
            b.putString("new", "msg from SecondReceiver");
            setResultExtras(b);
        }
    }
}

ThirdReceiver(当limit==10的时候获取msg和上一个reveicer添加的msg打印并退出,否则添加一个新的msg给下一个Receicer)

代码语言:javascript
复制
public class ThirdReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int limit = intent.getIntExtra("limit", -1001);
        if(limit == 10){
            String msg = intent.getStringExtra("msg");

            Bundle b = getResultExtras(true);
            String str = b.getString("new");

            Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
            abortBroadcast();
        } else {
            Bundle b = new Bundle();
            b.putString("new", "msg from ThirdReceiver");
            setResultExtras(b);
        }
    }
}

测试用的MainActiviy(当然三个BroadcastReceiver也要设置优先级)

代码语言:javascript
复制
        Intent intent = new Intent();
        intent.setAction("");//填在AndroidManifest.xml里面的action
        intent.putExtra("limit", 100);
//只有SecondReceiver会来处理
        intent.putExtra("msg", "msg from MainActivity");
    sendOrderedBroadcast(intent, null);

3.总结

1.优点 可以对请求者和处理者的关系解耦,提高代码的灵活性。 2.缺点 每次都需要对链中请求处理者遍历,如果处理者太多那么遍历必定会影响性能,特别是在一些递归调用者中,要慎用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年03月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.定义
  • 2.实战演练
  • 3.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档