责任链模式

scorlw 发布于

责任链模式

设计模式

Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。

例1:比如客户 Client要完成一个任务,这个任务包括a,b,c,d四个部分。

首先客户 Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,…,直到D完成d部分。

例2:比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。

例3:软件窗口的消息传插。

例4:SERVLET容器的过滤器( Filter)框架实现。

image-20201022143116084

Handler

​ 处理类的抽象父类。

concreteHandler

​ 具体的处理类。

责任链优缺点

优点:

1.责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的贡任范围,符合类的最小封装原则。

2.可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。

3.类与类之间可以以松耦合的形式加以组织。

缺点:

因为处理时以链的形式在对象间传递淯息,根据实现方式不同,有可能会影响处理的速度。

适用于:

链条式处理事情。工作流程化、消息处理流程化、事物流程化;

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>

using namespace std;

class CarHandle
{
public:
virtual void HandleCar() = 0;
CarHandle* setNextHandle(CarHandle* handle)
{
m_handle = handle;
}
protected:
CarHandle* m_handle;
private:
};

class HeadCarHandle : public CarHandle
{
public:
virtual void HandleCar()
{
cout << "造车头" << endl;
if(m_handle != NULL)
{
m_handle->HandleCar();
}
}
protected:
private:
};

class BodyCarHandle : public CarHandle
{
public:
virtual void HandleCar()
{
cout << "造车身" << endl;
if(m_handle != NULL)
{
m_handle->HandleCar();
}
}
protected:
private:
};

class TailCarHandle : public CarHandle
{
public:
virtual void HandleCar()
{
cout << "造车尾" << endl;
if(m_handle != NULL)
{
m_handle->HandleCar();
}
}
protected:
private:
};

int main()
{
CarHandle* headCarHandle = new HeadCarHandle;
CarHandle* bodyCarHandle = new BodyCarHandle;
CarHandle* tailCarHandle = new TailCarHandle;

//定义逻辑部分
headCarHandle->setNextHandle(bodyCarHandle);
bodyCarHandle->setNextHandle(tailCarHandle);

//显式执行第一个流程就可以
headCarHandle->HandleCar();


delete headCarHandle;
delete bodyCarHandle;
delete tailCarHandle;

cout << "Hello world!" << endl;
return 0;
}

输出:

1
2
3
4
造车头
造车身
造车尾
Hello world!