责任链模式-定义?
第一点:使多个对象有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。
第二点:将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式-应用场景
多个对象同时处理同一请求,但是由哪个对象处理那么在运行的时候决定。
责任链模式-角色划分?
角色一:抽象处理对象->Handler
两个特点
第一个:声明一个处理方法
第二个:保持一个对下一个处理节点的对象引用
角色二:具体处理对象->OneHandler、TwoHandler
在条件满足的情况下,处理对相应的请求操作
责任链模式-原理案例
结构->结束,只有没有结束继续往下传递,指导终止为止UIView->UIImageView->UIImageView。
责任链模式 案例
例如:
项目组长->签字报销金额->5000以内
项目主管->签字报销金额->100000以内
公司老板->签字报销金额->10万以上
第一个角色:抽象处理类->Leader(领导类)
第二个角色:报销单
第三个角色:项目组长
第四个角色:项目主管
第五个角色:公司老板
代码如下:
角色一:抽象处理类->Leader(领导类)(可以定义成协议,也可以定义成基类)
class Leader: NSObject {
var nextHandler:Leader?
//划分等级(如果是否一个等级,那么我进行传递)
final func handlerRequest(account:ExpenseAccount) {
if self.limit() > account.money {
//只想当前对象处理逻辑
//我的签字批改金额 > 报销金额,那么我是可以签字
handler(account: account)
} else {
if self.nextHandler != nil {
self.nextHandler?.handlerRequest(account: account)
} else {
print("没有需要执行的处理请求...")
}
}
}
//职位
func jobName() -> String {
return ""
}
//审核额度
func limit() -> Float {
return 0
}
func handler(account:ExpenseAccount) {
}
}
处理事件的内容
class ExpenseAccount: NSObject {
//报销单金额
var money:Float
//报销单项目
var title:String
//报销单内容
var content:String
init(money:Float, title:String, content:String) {
self.money = money
self.title = title
self.content = content
}
}
角色二: 具体请求者 一
class LeaderGroup: Leader {
override func limit() -> Float {
return 5000
}
override func jobName() -> String {
return "组长"
}
override func handler(account: ExpenseAccount) {
print("\(jobName())签字报销")
print("报销项目: \(account.title), 报销内容: \(account.content), 报销金额: \(account.money)")
}
}
角色二:具体请求者二
class LeaderManager: Leader {
override func limit() -> Float {
return 100000
}
override func jobName() -> String {
return "主管"
}
override func handler(account: ExpenseAccount) {
print("\(jobName())签字报销")
print("报销项目: \(account.title), 报销内容: \(account.content), 报销金额: \(account.money)")
}
}
角色二:具体请求者三
class LeaderCEO: Leader {
override func limit() -> Float {
return 100000000
}
override func jobName() -> String {
return "CEO"
}
override func handler(account: ExpenseAccount) {
print("\(jobName())签字报销")
print("报销项目: \(account.title), 报销内容: \(account.content), 报销金额: \(account.money)")
}
}
外部调用
let account = ExpenseAccount(money: 998, title: "公用报销", content: "外星人电脑顶配")
let ceo = LeaderCEO()
let manager = LeaderManager()
let group = LeaderGroup()
group.nextHandler = manager
manager.nextHandler = ceo
//组长审批
group.handlerRequest(account: account)
网友评论