Chain of Responsibility 责任链模式
We set a chain of responsibility. Then it t allow the solver solve the request or sends the request to the next another solver. As the diagram shown below, the handler is one solver of the chain.
我们设定了一条责任链,然后它允许处理者选择处理请求或者将请求发送给下一个其它的处理者。下图中,handler 是责任链上的一个处理者。
// Problem wait to be solve
class Request {
var priority: Int
var s: String
init(p: Int, s: String) {
priority = p
self.s = s
}
}
// Handler
protocol Thought {
func solve(r: Request)
}
// Base handler
class People: Thought {
var next: People?
func setNext(next: People) {
self.next = next
}
func solve(r: Request) {
if let n = next {
n.solve(r: r)
} else {
print("No people want to solve")
}
}
}
// Concrete handler
class Guard: People {
override func solve(r: Request) {
if r.priority < 2 {
print("Just be sovled by Guard [\(r.s)]")
print(r.s)
} else {
super.solve(r: r)
}
}
}
// Concrete handler
class Commander: People {
override func solve(r: Request) {
if r.priority < 4 {
print("Commander solve [\(r.s)]")
} else {
super.solve(r: r)
}
}
}
// Concrete handler
class Leader: People {
override func solve(r: Request) {
if r.priority < 10 {
print("Leader come and solve [\(r.s)]")
} else {
super.solve(r: r)
}
}
}
let g = Guard()
let c = Commander()
let l = Leader()
g.setNext(next: c)
c.setNext(next: l)
let r = Request(p: 9, s: "Let us in")
g.solve(r: r)
以上代码中,Guard 、Commander、leader 具有不同的权限可以处理请求,首先是设定它们之间的关系,顺序是 g、c、l,从而构建一条责任链。处理请求时,从 g 开始,若当前处理结点能够处理,则立即处理,若当前结点无法处理,则交给下一个处理结点。
有判断,处理力所能及的事情,若超过能力范围,则把任务交给他人。
若没有判断而直接处理,则属于主动承担责任,值得鼓励但长期运行不利于整体发展。
若没有判断,也不处理,就把任务交给他人,则属于推卸责任。
在界面的响应中,叠在一起的 view ,使用了责任链对触发事件进行响应,若最顶层的 view 收到事件,它可以选择处理事件,也可以选择把事件传递给下一层,这取决于具体的业务需要,我们可以对它进行设置事件响应。