Android源码设计模式解析与实战(九)
Android源码设计模式解析与实战(九)
xingjm8511 发表于10个月前
Android源码设计模式解析与实战(九)
  • 发表于 10个月前
  • 阅读 17
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 是编程更有灵活性——责任链模式

1. 责任链模式介绍

责任链模式是行为型设计模式之一。将每个节点看做是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者间的耦合关系。

个人理解,和Android中的View事件处理机制类似

2. 责任链模式的使用场景

(1) 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定

(2) 在请求处理者不明确的情况下向多个对象中的一个提交一个请求

(3) 需要动态指定一组对象处理请求

3. 责任链模式实例

Android中有两种广播,一种是Normal Braodcast普通广播,一种是Ordered Broadcast有序广播,普通广播是异步的,发出时可以被所有的接收者知道;而有序广播则是根据优先级依次传播的,直到有接收者将其终止或所有接收者都不终止它。有序广播的这一特性与责任链模式很接近。

public class FirstReceiver extends BroadcastReceiver {
    @Override
    public void onReceiver(Context context, Intent intent) {
        int limit = intent.getIntExtra("limit", -1001);
        if (limit == 1000) {
            Toast.makeText(context, "First", Toast.LENGTH_SHORT).show();
            // 终止广播
            abortBroadcast();
        } else {
            // 不处理广播,广播继续发送给下一个接收者
        }
    }
}
public class SecondReceiver extends BroadcastReceiver {
    @Override
    public void onReceiver(Context context, Intent intent) {
        int limit = intent.getIntExtra("limit", -1001);
        if (limit == 100) {
            Toast.makeText(context, "Second", Toast.LENGTH_SHORT).show();
            // 终止广播
            abortBroadcast();
        } else {
            // 不处理广播,广播继续发送给下一个接收者
        }
    }
}
public class ThirdReceiver extends BroadcastReceiver {
    @Override
    public void onReceiver(Context context, Intent intent) {
        int limit = intent.getIntExtra("limit", -1001);
        if (limit == 10) {
            Toast.makeText(context, "Third", Toast.LENGTH_SHORT).show();
            // 终止广播
            abortBroadcast();
        } else {
            // 不处理广播,广播继续发送给下一个接收者
        }
    }
}
<receiver android:name=".FirstReceiver">
    <intent-filter android:priority="1000">
        <action android:name="com.test.action.ORDER_BROADCAST"/>
    </intent-filter>
</receiver>
<receiver android:name=".SecondReceiver">
    <intent-filter android:priority="100">
        <action android:name="com.test.action.ORDER_BROADCAST"/>
    </intent-filter>
</receiver>
<receiver android:name=".ThirdReceiver">
    <intent-filter android:priority="10">
        <action android:name="com.test.action.ORDER_BROADCAST"/>
    </intent-filter>
</receiver>

 

共有 人打赏支持
粉丝 18
博文 109
码字总数 45031
×
xingjm8511
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: