Skip to content

Commit 654fb44

Browse files
committed
补充设计模式部分
1 parent 5ee6cff commit 654fb44

19 files changed

+1910
-99
lines changed

README.md

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
网站地址:https://topjavaer.cn
1414

15-
![](http://img.dabin-coder.cn/image/image-20221030165150524.png)
15+
![](http://img.topjavaer.cn/img/image-20221030165150524.png)
1616

1717
# 仓库简介
1818

@@ -24,24 +24,25 @@
2424

2525
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的**公众号『 程序员大彬 』**,后台回复『 PDF 』可以**下载最新版本的大厂高频面试题目PDF版本**
2626

27-
<div align="center"><img src="http://img.dabin-coder.cn/image/公众号.jpg" style="zoom:90%;" />
27+
<div align="center"><img src="http://img.topjavaer.cn/img/公众号.jpg" style="zoom:90%;" />
2828
<p>个人公众号</p>
2929
</div>
3030
<p align="center">
3131
<br>
32-
<a href="http://img.dabin-coder.cn/image/个人微信索隆(交流群).png"><img src="http://img.dabin-coder.cn/image/微信交流群.png" alt="微信交流群"></a>
33-
<a href="http://img.dabin-coder.cn/image/公众号.jpg"><img src="http://img.dabin-coder.cn/image/公众号.png" alt="公众号"></a>
34-
<a href="https://www.zhihu.com/people/dai-shu-bin-13"><img src="http://img.dabin-coder.cn/image/知乎.png" alt="知乎"></a>
35-
<a href="https://www.nowcoder.com/profile/8683776/myDiscussPost"><img src="http://img.dabin-coder.cn/image/牛客网.png" alt="牛客网"></a>
36-
<a href="https://juejin.cn/user/201965869218574/posts"><img src="http://img.dabin-coder.cn/image/掘金.png" alt="掘金"></a>
37-
<a href="https://github.com/Tyson0314/java-books"><img src="http://img.dabin-coder.cn/image/免费计算机电子书籍.png" alt="免费PDF"></a>
32+
<a href="http://img.topjavaer.cn/img/个人微信索隆(交流群).png"><img src="http://img.topjavaer.cn/img/微信交流群.png" alt="微信交流群"></a>
33+
<a href="http://img.topjavaer.cn/img/公众号.jpg"><img src="http://img.topjavaer.cn/img/公众号.png" alt="公众号"></a>
34+
<a href="https://www.zhihu.com/people/dai-shu-bin-13"><img src="http://img.topjavaer.cn/img/知乎.png" alt="知乎"></a>
35+
<a href="https://www.nowcoder.com/profile/8683776/myDiscussPost"><img src="http://img.topjavaer.cn/img/牛客网.png" alt="牛客网"></a>
36+
<a href="https://juejin.cn/user/201965869218574/posts"><img src="http://img.topjavaer.cn/img/掘金.png" alt="掘金"></a>
37+
<a href="https://github.com/Tyson0314/java-books"><img src="http://img.topjavaer.cn/img/免费计算机电子书籍.png" alt="免费PDF"></a>
3838
</p>
3939

4040

4141

4242
# 简历很重要
4343

44-
[简历投递之后总是石沉大海?](https://zhuanlan.zhihu.com/p/406982597)
44+
- [23套精美简历模板](https://mp.weixin.qq.com/s?__biz=Mzg2OTY1NzY0MQ==&mid=2247489358&idx=1&sn=dd1b91f115438c29a4215c674b8761e4&chksm=ce98ea08f9ef631e2c8361269f28c01db73eca1ff5b91ba0a0ec8c9a6b9fdcb46a5e16c57020#rd)
45+
- [简历投递之后总是石沉大海?](docs/campus-recruit/resume.md)
4546

4647
# 精选资源
4748

@@ -54,11 +55,20 @@
5455
# Java
5556

5657
- [**Java高频面试题总结**](docs/java/java-basic.md) (推荐 :+1:)
57-
- [Java8 新特性总结](docs/java/java8-all.md)
5858
- [Java集合高频面试题](docs/java/java-collection.md)(推荐 :+1:)
5959
- [Java并发高频面试题](docs/java/java-concurrent.md) (推荐 :+1:)
6060
- [JVM高频面试题](/docs/java/jvm.md)(推荐 :+1:)
6161

62+
**Java重要知识点**
63+
64+
- [Java8新特性总结](docs/java/java8-all.md)
65+
- [Java19新特性](docs/advance/excellent-article/19-java19.md)
66+
67+
**JVM重要知识点**
68+
69+
- [美团面试:熟悉哪些JVM调优参数?](docs/advance/excellent-article/9-jvm-optimize-param.md)
70+
- [一次简单的JVM调优,拿去写到简历里](docs/advance/excellent-article/5-jvm-optimize.md)
71+
6272
# 数据库
6373

6474
## MySQL
@@ -67,16 +77,21 @@
6777

6878
**重要知识点**
6979

70-
- [8种最坑SQL语法](docs/advance/excellent-article/7-sql-optimize.md)
71-
7280
- [MySQL执行计划详解](docs/database/mysql-execution-plan.md)(推荐 :+1:)
73-
7481
- [图解索引下推](https://mp.weixin.qq.com/s/W1XQYmihtSdbLWQKeNwZvQ)(推荐 :+1:)
82+
- [MySQL最大建议行数 2000w,靠谱吗?](docs/advance/excellent-article/12-mysql-table-max-rows.md)
83+
- [order by是怎么工作的?](docs/advance/excellent-article/13-order-by-work.md)
84+
- [8种最坑SQL语法](docs/advance/excellent-article/7-sql-optimize.md)
85+
- [为什么说数据库连接很消耗资源](docs/advance/excellent-article/18-db-connect-resource.md)
7586

7687
## Redis
7788

7889
- [Redis高频面试题总结](docs/redis/redis.md)(牛客高赞,推荐 :+1:)
7990

91+
**重要知识点**
92+
93+
- [Redis如何实现库存扣减操作和防止被超卖?](docs/advance/excellent-article/1-redis-stock-minus.md)
94+
8095
## ElasticSearch
8196

8297
- [ElasticSearch高频面试题](https://mp.weixin.qq.com/s/Ffb8NDgavf9QAWYBm0qAVg)
@@ -85,13 +100,22 @@
85100

86101
## Spring
87102

88-
1. [Spring高频面试题30道](docs/framework/spring.md)(推荐 :+1:)
103+
- [Spring高频面试题30道](docs/framework/spring.md)(推荐 :+1:)
104+
105+
**重要知识点**
106+
107+
- [Spring为何需要三级缓存解决循环依赖,而不是二级缓存?](docs/advance/excellent-article/6-spring-three-cache.md)
108+
- [@Transactional事务注解详解](docs/advance/excellent-article/2-spring-transaction.md)
89109

90110
## Spring Boot
91111

92-
[Spring Boot总结](框架/SpringBoot实战.md)
112+
- [Spring Boot总结](框架/SpringBoot实战.md)
113+
114+
- [SpringBoot面试题总结](docs/framework/springboot.md)
93115

94-
[SpringBoot面试题总结](docs/framework/springboot.md)
116+
**重要知识点**
117+
118+
- [SpringBoot自动装配原理](docs/advance/excellent-article/3-springboot-auto-assembly.md)
95119

96120
## Spring MVC
97121

@@ -117,6 +141,10 @@
117141

118142
[计算机网络常见面试题总结](docs/computer-basic/network.md)**知乎1k+收藏!推荐 :+1:**
119143

144+
**重要知识点**
145+
146+
- [有了HTTP,为啥还要用RPC](docs/advance/excellent-article/15-http-vs-rpc.md)
147+
120148
# 数据结构与算法
121149

122150
- [常见数据结构总结](docs/computer-basic/data-structure.md)
@@ -188,11 +216,6 @@
188216
- [什么是JWT?](docs/advance/excellent-article/16-what-is-jwt.md)
189217
- [单点登录(SSO)设计与实现](docs/advance/system-design/8-sso-design.md)
190218

191-
# 编程实践
192-
193-
1. [线上接口很慢怎么办?](docs/practice/service-performance-optimization.md)
194-
2. [干掉 “重复代码” 的技巧有哪些](docs/advance/excellent-article/4-remove-duplicate-code.md)
195-
196219
# 大厂面经汇总
197220

198221
- [字节跳动](docs/campus-recruit/interview/1-byte-and-dance.md)
@@ -208,9 +231,15 @@
208231

209232
# 优质文章
210233

211-
[优质文章汇总,持续更新中~](https://topjavaer.cn/advance/excellent-article/)
212-
213-
![](http://img.dabin-coder.cn/image/image-20221030172546796.png)
234+
- [干掉“重复代码”的技巧有哪些](docs/advance/excellent-article/4-remove-duplicate-code.md)
235+
- [面试官:如何保证接口幂等性?一口气说了12种方法!](docs/advance/excellent-article/8-interface-idempotent.md)
236+
- [大文件上传时如何做到秒传?](docs/advance/excellent-article/10-file-upload.md)
237+
- [架构的演进](docs/advance/excellent-article/14-architect-forward.md)
238+
- [8种架构模式](docs/advance/excellent-article/11-8-architect-pattern.md)
239+
- [限流的几种方案](docs/advance/excellent-article/17-limit-scheme.md)
240+
- [几种常见的架构模式](docs/advance/excellent-article/20-architect-pattern.md)
241+
- [新一代分布式任务调度框架](docs/advance/excellent-article/22-distributed-scheduled-task.md)
242+
- [线上接口很慢怎么办?](docs/practice/service-performance-optimization.md)
214243

215244
# 工具
216245

@@ -236,9 +265,9 @@
236265

237266
如果觉得**本仓库**对您有帮助的话,可以请大彬**喝一杯咖啡**(小伙伴们赞赏的时候可以备注下哦~
238267

239-
| 微信 | 支付宝 |
240-
| ------------------------------------------------- | ----------------------------------------------------- |
241-
| ![](http://img.dabin-coder.cn/image/微信收款.png) | ![](http://img.dabin-coder.cn/image/支付宝赞赏码.png) |
268+
| 微信 | 支付宝 |
269+
| --------------------------------------------- | ------------------------------------------------- |
270+
| ![](http://img.topjavaer.cn/img/微信收款.png) | ![](http://img.topjavaer.cn/img/支付宝赞赏码.png) |
242271

243272
每笔赞赏我会在下面记录下来,感谢你们,我会更加努力,砥砺前行~
244273

Lines changed: 114 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,123 @@
11
# 观察者模式
22

3-
定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。
3+
**观察者模式(Observer)**,又叫**发布-订阅模式(Publish/Subscribe)**,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。UML结构图如下:
44

5-
主题(Subject)是被观察的对象,而其所有依赖者(Observer)称为观察者。
5+
![](http://img.topjavaer.cn/img/观察者1.png)
66

7-
多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。其作用是让主题对象和观察者松耦合
7+
其中,Subject类是主题,它把所有对观察者对象的引用文件存在了一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供了一个接口,可以增加和删除观察者对象;Observer类是抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己;ConcreteSubject类是具体主题,将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知;ConcreteObserver是具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协同
88

9-
观察者模式所涉及的角色有:
9+
### 主题Subject
1010

11-
- 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。
12-
- 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
13-
- 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
14-
- 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。
11+
首先定义一个观察者数组,并实现增、删及通知操作。它的职责很简单,就是定义谁能观察,谁不能观察,用Vector是线程同步的,比较安全,也可以使用ArrayList,是线程异步的,但不安全。
1512

13+
```java
14+
public class Subject {
1615

16+
//观察者数组
17+
private Vector<Observer> oVector = new Vector<>();
1718

19+
//增加一个观察者
20+
public void addObserver(Observer observer) {
21+
this.oVector.add(observer);
22+
}
23+
24+
//删除一个观察者
25+
public void deleteObserver(Observer observer) {
26+
this.oVector.remove(observer);
27+
}
28+
29+
//通知所有观察者
30+
public void notifyObserver() {
31+
for(Observer observer : this.oVector) {
32+
observer.update();
33+
}
34+
}
35+
36+
}
37+
```
38+
39+
### 抽象观察者Observer
40+
41+
观察者一般是一个接口,每一个实现该接口的实现类都是具体观察者。
42+
43+
```java
44+
public interface Observer {
45+
//更新
46+
public void update();
47+
}
48+
```
49+
50+
### 具体主题
51+
52+
继承Subject类,在这里实现具体业务,在具体项目中,该类会有很多变种。
53+
54+
```java
55+
public class ConcreteSubject extends Subject {
56+
57+
//具体业务
58+
public void doSomething() {
59+
//...
60+
super.notifyObserver();
61+
}
62+
63+
}
64+
```
65+
66+
### 具体观察者
67+
68+
实现Observer接口。
69+
70+
```java
71+
public class ConcreteObserver implements Observer {
72+
73+
@Override
74+
public void update() {
75+
System.out.println("收到消息,进行处理");
76+
}
77+
78+
}
79+
```
80+
81+
### Client客户端
82+
83+
首先创建一个被观察者,然后定义一个观察者,将该被观察者添加到该观察者的观察者数组中,进行测试。
84+
85+
```java
86+
public class Client {
87+
88+
public static void main(String[] args) {
89+
//创建一个主题
90+
ConcreteSubject subject = new ConcreteSubject();
91+
//定义一个观察者
92+
Observer observer = new ConcreteObserver();
93+
//观察
94+
subject.addObserver(observer);
95+
//开始活动
96+
subject.doSomething();
97+
}
98+
99+
}
100+
```
101+
102+
运行结果如下:
103+
104+
```java
105+
收到消息,进行处理
106+
```
107+
108+
### 观察者模式的优点
109+
110+
- 观察者和被观察者是抽象耦合的
111+
- 建立了一套触发机制
112+
113+
### 观察者模式的缺点
114+
115+
- 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
116+
- 如果观察者和观察目标间有循环依赖,可能导致系统崩溃
117+
- 没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的
118+
119+
### 观察者模式的使用场景
120+
121+
- 关联行为场景
122+
- 事件多级触发场景
123+
- 跨系统的消息变换场景,如消息队列的处理机制

0 commit comments

Comments
 (0)