Skip to content

Commit 629d14a

Browse files
committed
Chain of Responsibility Pattern
1 parent c70278b commit 629d14a

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed
Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,76 @@
1-
// 职责链模式(Chain of Responsibility Pattern)
1+
// 职责链模式(Chain of Responsibility Pattern)
2+
3+
// 采购请求
4+
let PurchaseRequest = (amount, productName) => {
5+
this.amount = amount
6+
this.productName = productName
7+
}
8+
9+
// 处理方
10+
let Approver = (name, nextApprover) => {
11+
this.name = name
12+
this.nextApprover = nextApprover
13+
}
14+
15+
Approver.prototype.processRequest = () => {
16+
throw new Error()
17+
}
18+
19+
// ConcreteHandler
20+
let Manager = (name, nextApprover) => {
21+
Approver.call(this, name, nextApprover)
22+
}
23+
extend(Manager, Approver)
24+
Manager.prototype.processRequest = (request) => {
25+
if (request.Amount < 10000.0) {
26+
console.log('ok')
27+
} else if (NextApprover != null) {
28+
this.nextApprover.ProcessRequest(request)
29+
}
30+
}
31+
32+
33+
// ConcreteHandler,副总
34+
let VicePresident = function (name, nextApprover) {
35+
Approver.call(this, name, nextApprover)
36+
}
37+
extend(VicePresident, Approver);
38+
VicePresident.prototype.processRequest = function (request) {
39+
if (request.Amount < 25000.0) {
40+
console.log('ok');
41+
} else if (NextApprover != null) {
42+
this.nextApprover.ProcessRequest(request)
43+
}
44+
}
45+
46+
47+
// ConcreteHandler,总经理
48+
let President = function (name, nextApprover) {
49+
Approver.call(this, name, nextApprover)
50+
}
51+
extend(President, Approver)
52+
President.prototype.processRequest = function (request) {
53+
if (request.Amount < 100000.0) {
54+
console.log('ok')
55+
} else if (NextApprover != null) {
56+
this.nextApprover.ProcessRequest(request)
57+
}
58+
}
59+
60+
61+
let requestTelphone = new PurchaseRequest(4000.0, "Telphone")
62+
let requestSoftware = new PurchaseRequest(10000.0, "Visual Studio")
63+
let requestComputers = new PurchaseRequest(40000.0, "Computers")
64+
65+
let manager = new Manager("LearningHard")
66+
let Vp = new VicePresident("Tony")
67+
let Pre = new President("BossTom")
68+
69+
// 设置责任链
70+
manager.NextApprover = Vp
71+
Vp.NextApprover = Pre
72+
73+
// 处理请求
74+
manager.ProcessRequest(requestTelphone)
75+
manager.ProcessRequest(requestSoftware)
76+
manager.ProcessRequest(requestComputers)

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@
125125

126126
> [职责链模式(Chain of Responsibility Pattern)](/Example/Chain-Of-Responsibility-Pattern.js)
127127
128+
定义:为请求创建了一个接收者对象的链。
129+
目的:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
130+
场景:红楼梦中的"击鼓传花"。
131+
128132
> [中介者模式(Mediator Pattern)](/Example/Memento-Pattern.js)
129133
130134
> [解释器模式(Interpreter Pattern)](/Example/Iterator-Pattern.js)

0 commit comments

Comments
 (0)