责任链模式
1、什么是责任链模式
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
责任链中主要有两个属性:
- 链接下一个对象的属性
- 对应的响应方法
链接对象实现事件的传递、响应方法判断是否能自己可以处理该请求。是一种十分典型的链式结构 。
在正常的生活中,也有这样的情况,比如说一个办公室内有5个 iOS(ABCDE) ,有一天,产品发现了一个 bug 然后问第一个 iOS A:“能不能处理这个 bug?” 而 A 表示:“我并不负责这一部分的内容,你可以去问一下 B(第二个 iOS)” 接着产品就去问了B ,B 也表示他不负责这块,并把产品推给C,此时 C 表示他可以处理,则责任到此结束,C 被喊去修改 BUG 了,也不用再去询问 D 跟 E 了。
2、责任链模式用在什么地方
- 有多个对象可以处理同一个请求,动态确定谁可以处理该请求
- 不明确指定接受者的情况下,给多个对象中的其中一个对象发送请求
- 动态指定一组对象实现请求
虽然说责任链一般是指当一个对象可以处理时候停止传递,但是在有需求的时候,就算不停止传递也没有关系。
3、责任链模式的使用
- 定义责任父类,定义链接到下一个对象的属性和需要进行传递的方法.
- 定义责任子类,判断是否能够处理,实现处理方案,并链接到下个责任子类。
在 iOS 中,有许多情况使用到了责任链模式,最典型的就是响应链。一层层的往下,直到有对象可以接受为止。
4、总结
责任链模式是比较经典和简单的一种设计模式,不过使用范围比较小,因为不容易调试,所以容易被其他的设计模式所取代(例如迭代器模式什么的)。
至于他本身的话,具有解耦合、简化使用和增加灵活性等优点,不过需要注意的一点是有可能会存在没有人可以处理的情况,此时则需要特别判断。
5、demo
class DutyHandle : NSObject {
/// 下一个
var next : DutyHandle?
/// 处理请求操作
func handleRequest(str:String) {
/// 如果可以则直接处理
if (self.canDealWithRequest(str: str)){
print(str)
}
else {
/// 否则如果有下一个,则下一个进行处理判断
if ((next) != nil) {
next?.handleRequest(str: str);
}
}
}
/// 判断能否处理请求
func canDealWithRequest(str:String) -> Bool {
return false;
}
}
网友评论