前言
职责链模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
职责链模式
使用场景:处理任务需要经过一个一个环节,这个任务可以在某个环节直接完成,也可以经过所有环节再完成,比如常见的 食品加工、项目交付等等。
理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,很常见。这种设计模式很像是公司里的OA审判流程。这种设计模式也很简单。一般用于作为 过滤器、拦截器来使用,当然也可以作为业务流程处理。我觉得它的意义是 通过这种经典的交互行为,让操作者和处理者解耦了,操作者只需要提供数据,处理者只需要定义功能接口,然后根据数据和相关业务来进行处理即可。这样就能通过面向接口编程,实现一套精准的流程控制了。
namespace action_mode_04 {
interface IApproval {
leaveDays: number
borrowMoney: number
approval(name: string, leaveDays: number, borrowMoney: number): boolean
}
class GroupLeader implements IApproval {
leaveDays: number = 2
borrowMoney: number = 1500
approval(name: string, leaveDays: number, borrowMoney: number): boolean {
console.log(`
${name}:请假${leaveDays}天,借钱${borrowMoney}元。
`)
console.log(`审批到达项目组长
组长最大权限:支持请假${this.leaveDays}天和借钱${this.borrowMoney}元。
`)
return this.leaveDays >= leaveDays && this.borrowMoney >= borrowMoney
}
}
class ProjectManager implements IApproval {
leaveDays: number = 7
borrowMoney: number = 5000
approval(name: string, leaveDays: number, borrowMoney: number): boolean {
console.log(`
${name}:请假${leaveDays}天,借钱${borrowMoney}元。
`)
console.log(`审批到达项目经理
PM最大权限:支持请假${this.leaveDays}天或借钱${this.borrowMoney}元。
`)
// 请假 和 借钱 只能二选一
if (leaveDays > 1 && borrowMoney > 1) {
return false
}
return this.leaveDays >= leaveDays && this.borrowMoney >= borrowMoney
}
}
class CEO implements IApproval {
leaveDays: number = 30
borrowMoney: number = 25000
approval(name: string, leaveDays: number, borrowMoney: number): boolean {
console.log(`
${name}:请假${leaveDays}天,借钱${borrowMoney}元。
`)
console.log(`审批到达首席执行董事长
CEO最大权限:支持请假${this.leaveDays}天和借钱${this.borrowMoney}元。
`)
return this.leaveDays >= leaveDays && this.borrowMoney >= borrowMoney
}
}
class Chain {
currentTask: IApproval
nextTaskChain?: Chain | null
constructor(task: IApproval) {
this.currentTask = task
this.nextTaskChain = null
}
setNext(nextTask: IApproval): Chain {
this.nextTaskChain = new Chain(nextTask)
return this.nextTaskChain
}
approvalHandler(name: string, leaveDays: number, borrowMoney: number): void {
let result = this.currentTask.approval(name, leaveDays, borrowMoney)
if (result) {
console.log(' ################# 操作成功!!!!! ################# ')
return
}
if (this.nextTaskChain) {
console.log(' ================= 权限不足,开启下一个审批流程 ================= ')
this.nextTaskChain.approvalHandler(name, leaveDays, borrowMoney)
} else {
console.log(' ################# 操作失败!!!!! ################# ')
}
}
}
const groupLeaderChainNode = new Chain(new GroupLeader())
groupLeaderChainNode.setNext(new ProjectManager()).setNext(new CEO())
groupLeaderChainNode.approvalHandler('员工小梦', 1, 200)
groupLeaderChainNode.approvalHandler('员工小李', 10, 200)
groupLeaderChainNode.approvalHandler('员工老李', 25, 50000)
}