实现责任链模式示例,添加经理类及相关方法,增强代码可读性

This commit is contained in:
2026-01-04 16:19:02 +08:00
parent 9bb30b8bfb
commit feaa733595
3 changed files with 216 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
/*
实例:
汤宝宝申请报销款,需要走产品经理、部门经理和总经理的审核~
*/
class Manager {
protected successor: Manager | null = null;
protected name: string;
protected amount: number = 0;
constructor(name: string) {
this.name = name;
}
setSuccessor(successor: Manager) {
this.successor = successor;
console.log(`${this.name}的下一级经理是${successor.name}`);
}
setAmountRight(amount: number) {
this.amount = amount;
console.log(`${this.name}的报销权限是${amount.toFixed(2)}元`);
}
haveRight(amount: number): boolean {
const right = amount <= this.amount;
if (right) {
console.log(`${this.name}有权限审批${amount.toFixed(2)}元的报销请求`);
} else {
console.log(`${this.name}没有权限审批${amount.toFixed(2)}元的报销请求`);
}
return right;
}
approve(name: string, amount: number) {
console.log(`${name}提交了一笔${amount.toFixed(2)}元的报销请求`);
if (this.haveRight(amount)) {
console.log(`${this.name}审批通过了${name}的报销请求,金额为${amount.toFixed(2)}元`);
} else if (this.successor) {
console.log(`${this.name}将${name}的报销请求上报给${this.successor.name}审批`);
this.successor.approve(name, amount);
} else {
console.log(`没有合适的经理审批${name}的报销请求,金额为${amount.toFixed(2)}元`);
}
}
}
(function(){
console.log("========= 责任链模式 =========");
// 创建经理
const pm = new Manager("产品经理");
pm.setAmountRight(1000);
const dm = new Manager("部门经理");
dm.setAmountRight(5000);
const gm = new Manager("总经理");
gm.setAmountRight(20000);
// 设置责任链
pm.setSuccessor(dm);
dm.setSuccessor(gm);
// 提交报销请求
console.log("-----");
pm.approve("汤宝宝", 800);
console.log("-----");
pm.approve("汤宝宝", 3000);
console.log("-----");
pm.approve("汤宝宝", 15000);
console.log("-----");
pm.approve("汤宝宝", 25000);
console.log("\n======= 责任链模式结束 =======");
})();