Skip to content

Commit e043ede

Browse files
committed
docs:新增重构专栏
1 parent dc5c683 commit e043ede

File tree

3 files changed

+534
-1
lines changed

3 files changed

+534
-1
lines changed

docs/.vuepress/config.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ module.exports = {
206206
link: '/md/netty/base/ChannelPipeline接口.md'
207207
}, ]
208208
},
209+
209210
{
210211
text: 'MQ',
211212
items: [
@@ -226,7 +227,38 @@ module.exports = {
226227
]
227228
},
228229
]
230+
},
231+
232+
{
233+
text: '重构',
234+
items: [
235+
{
236+
text: '重构',
237+
items: [{
238+
text: '代码的坏味道',
239+
link: '/md/design/代码的坏味道.md'
240+
},
241+
]
242+
},
243+
{
244+
text: '设计原则',
245+
items: [{
246+
text: 'Kafka门派知多少',
247+
link: '/md/kafka/Kafka门派知多少.md'
248+
},
249+
]
250+
},
251+
{
252+
text: '设计模式',
253+
items: [{
254+
text: '00-RocketMQ',
255+
link: '/md/kafka/15-基于kafka实现延迟队列.md'
256+
},
257+
]
258+
},
259+
]
229260
},
261+
230262
{
231263
text: 'Java',
232264
items: [{
@@ -808,6 +840,14 @@ module.exports = {
808840
"Claude3到底多强",
809841
"GPTs推荐",
810842
]
843+
}],
844+
"/md/design/": [{
845+
title: "重构",
846+
collapsable: false,
847+
sidebarDepth: 0,
848+
children: [
849+
"代码的坏味道",
850+
]
811851
}],
812852
}
813853
}
Lines changed: 216 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,216 @@
1-
# **死磕设计模式之抽象责任链模式**
1+
# 死磕设计模式之抽象责任链模式
2+
3+
## 1 导读
4+
5+
### 1.1 定义
6+
7+
包含了一些命令对象和一系列处理对象。每个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。
8+
9+
该模式还描述了往该处理链的末尾添加新的处理对象的方法。
10+
11+
精简定义:为请求创建一个接收此次请求对象的链。
12+
13+
### 1.2 类型
14+
15+
行为型。
16+
17+
## 2 适用场景
18+
19+
一个请求的处理需要多个对象当中的一或几个协作处理。
20+
21+
## 3 优点
22+
23+
请求的发送者和接收者(请求的处理)解耦,责任链可动态组合。
24+
25+
## 4 缺点
26+
27+
- 责任链太长或者处理时间过长,影响性能
28+
- 责任链有可能过多
29+
30+
## 5 设计模式对比
31+
32+
### 5.1 V.S 状态模式
33+
34+
- 各对象并不指定下一个所要处理的对象者,只有在客户端类设置链顺序及元素,直到被某个责任链处理或整条链结束
35+
- 每个状态知道自己下一个所要处理的对象者是谁,即编译时确定
36+
37+
## 6 实战
38+
39+
```java
40+
package com.javaedge.design.pattern.behavioral.chainofresponsibility;
41+
42+
import lombok.Getter;
43+
import lombok.Setter;
44+
45+
/**
46+
* @author JavaEdge
47+
* @date 2019/1/19
48+
*/
49+
@Getter
50+
@Setter
51+
public class Course {
52+
53+
/**
54+
* 课程名
55+
*/
56+
private String name;
57+
58+
/**
59+
* 博客
60+
*/
61+
private String article;
62+
63+
/**
64+
* 视频
65+
*/
66+
private String video;
67+
}
68+
```
69+
70+
```java
71+
package com.javaedge.design.pattern.behavioral.chainofresponsibility;
72+
73+
import org.apache.commons.lang3.StringUtils;
74+
75+
/**
76+
* 【具体实现类】审批人
77+
*
78+
* @author JavaEdge
79+
*/
80+
public class ArticleApprover extends BaseApprover {
81+
82+
@Override
83+
public void deploy(Course course) {
84+
if (StringUtils.isNoneBlank(course.getArticle())) {
85+
System.out.println(course.getName() + "含博客,批准!");
86+
if (nextApprover != null) {
87+
nextApprover.deploy(course);
88+
}
89+
} else {
90+
System.out.println(course.getName() + "不含博客,拒绝!");
91+
}
92+
}
93+
}
94+
```
95+
96+
```java
97+
package com.javaedge.design.pattern.behavioral.chainofresponsibility;
98+
99+
/**
100+
* 审批人
101+
*
102+
* @author JavaEdge
103+
*/
104+
public abstract class BaseApprover {
105+
106+
protected BaseApprover nextApprover;
107+
108+
public void setNextApprover(BaseApprover baseApprover) {
109+
this.nextApprover = baseApprover;
110+
}
111+
112+
/**
113+
* 发布
114+
*
115+
* @param course 课程
116+
*/
117+
public abstract void deploy(Course course) ;
118+
}
119+
```
120+
121+
```java
122+
package com.javaedge.design.pattern.behavioral.chainofresponsibility;
123+
124+
import org.apache.commons.lang3.StringUtils;
125+
126+
import java.util.Objects;
127+
128+
/**
129+
* 【具体实现类】审批人
130+
*
131+
* @author JavaEdge
132+
*/
133+
public class VideoApprover extends BaseApprover {
134+
135+
@Override
136+
public void deploy(Course course) {
137+
if (StringUtils.isNoneEmpty(course.getVideo())) {
138+
System.out.println(course.getName() + "含视频,批准!");
139+
if (Objects.nonNull(nextApprover)) {
140+
nextApprover.deploy(course);
141+
}
142+
} else {
143+
System.out.println(course.getName() + "不含视频,拒绝!");
144+
}
145+
}
146+
}
147+
```
148+
149+
UML:
150+
151+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/UML.png)
152+
153+
测试类:
154+
155+
```java
156+
package com.javaedge.design.pattern.behavioral.chainofresponsibility;
157+
158+
/**
159+
* @author JavaEdge
160+
*/
161+
public class Test {
162+
163+
public static void main(String[] args) {
164+
BaseApprover articleApprover = new ArticleApprover();
165+
BaseApprover videoApprover = new VideoApprover();
166+
167+
Course course = new Course();
168+
course.setName("公众号-Learner");
169+
course.setArticle("JavaEdge的博客");
170+
course.setVideo("JavaEdge的小视频");
171+
172+
articleApprover.setNextApprover(videoApprover);
173+
articleApprover.deploy(course);
174+
}
175+
}
176+
177+
output:
178+
公众号-Learner含博客,批准!
179+
公众号-Learner含视频,批准!
180+
```
181+
182+
将博客注释掉:
183+
184+
```java
185+
public static void main(String[] args) {
186+
BaseApprover articleApprover = new ArticleApprover();
187+
BaseApprover videoApprover = new VideoApprover();
188+
189+
Course course = new Course();
190+
course.setName("公众号-Learner");
191+
// course.setArticle("JavaEdge的博客");
192+
course.setVideo("JavaEdge的小视频");
193+
194+
articleApprover.setNextApprover(videoApprover);
195+
articleApprover.deploy(course);
196+
}
197+
198+
output:
199+
公众号-Learner不含博客,拒绝!
200+
```
201+
202+
## 7 框架应用
203+
204+
### 7.1 Tomcat#FilterChain
205+
206+
FilterChain 是一个由 Servlet 容器提供给开发人员的对象,提供一个对资源的过滤请求的调用链的视图。 过滤器使用 FilterChain 调用链中的下一个过滤器,或如果调用过滤器是链中的最后一个过滤器,则调用链末尾的资源
207+
208+
```java
209+
public interface FilterChain {
210+
211+
// 导致调用链中的下一个筛选器,或者如果调用筛选器是链中的最后一个筛选器,
212+
// 则会导致调用链末尾的资源
213+
public void doFilter(ServletRequest request, ServletResponse response)
214+
throws IOException, ServletException;
215+
}
216+
```

0 commit comments

Comments
 (0)