一、概述
COR属于行为型模式中的一种,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者。
二、适用性
1. 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3. 可处理一个请求的对象集合应被动态指定。
三、参与者
1. Handler:定义一个处理请求的接口。(可选)实现后继链。
2. ConcreteHandler:处理它所负责的请求。可访问它的后继者。如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
3. Client:向链上的具体处理者(ConcreteHandler)对象提交请求。
四、类图
五、代码实现
1. Handler:定义一个处理请求的接口。(可选)实现后继链。
RequestHandle.swift
import Foundation
/// 定义一个处理请求的接口
protocol RequestHandle {
func handleRequest(request:Request)
}
2. ConcreteHandler:处理它所负责的请求。可访问它的后继者。如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
a) HRRequestHandle.swift
import Foundation
/// 处理它所负责的请求。可访问它的后继者。
class HRRequestHandle: RequestHandle {
func handleRequest(request: Request) {
if request is DimissionRequest {
print("要离职, 人事审批!")
}
print("请求完毕")
}
}
b) PMRequestHandle.swift
import Foundation
/// 处理它所负责的请求。可访问它的后继者。
class PMRequestHandle: RequestHandle {
var rh:RequestHandle
init(requestHandle:RequestHandle){
self.rh = requestHandle
}
func handleRequest(request: Request) {
if request is AddMoneyRequest {
print("要加薪, 项目经理审批!")
} else {
rh.handleRequest(request)
}
}
}
c) TLRequestHandle.swift
import Foundation
/// 处理它所负责的请求。可访问它的后继者。
class TLRequestHandle: RequestHandle {
var rh:RequestHandle
init(requestHandle:RequestHandle){
self.rh = requestHandle
}
func handleRequest(request: Request) {
if request is LeaveRequest {
print("要请假, 项目组长审批!")
} else {
rh.handleRequest(request)
}
}
}
3. 提交的请求。
a) Request.swift
import Foundation
/// 请求接口
protocol Request {
}
b) DimissionRequest.swift
import Foundation
/// DimissionRequest离职请求
class DimissionRequest: Request {
}
c) AddMoneyRequest.swift
import Foundation
/// 加薪请求
class AddMoneyRequest: Request {
}
d) LeaveRequest.swift
import Foundation
/// 请假请求
class LeaveRequest: Request {
}
六、测试
1. 代码
// 职责链模式
let hr:RequestHandle = HRRequestHandle()
let pm:RequestHandle = PMRequestHandle(requestHandle: hr)
let tl:RequestHandle = TLRequestHandle(requestHandle: pm)
// 向链上的具体处理者(ConcreteHandler)对象提交请求
// team leader处理离职请求
var request:Request = DimissionRequest()
tl.handleRequest(request)
print("===========")
// team leader处理加薪请求
request = AddMoneyRequest()
tl.handleRequest(request)
print("===========")
// team leader处理请假请求
request = LeaveRequest()
tl.handleRequest(request)
2. 运行结果
要离职, 人事审批!
请求完毕
===========
要加薪, 项目经理审批!
===========
要请假, 项目组长审批!