# 觀察者模式
Observer Pattern,指多個對象間存在一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。這種模式有時又稱作發布-訂閱模式。
## 組成
1. 抽象主題(Subject):抽象目標類,包含了一組觀察者對象及對觀察者管理、通知的方法。
2. 具體主題:具體目標類,實現抽象目標類的通知方法,當具體主題的內部狀態發生改變時,通過所有注冊過的觀察者對象。
3. 抽象觀察者(Observer):抽象類或者接口,包含一個更新自己的抽象方法,當收到具體主題的更改通知時被調用。
4. 具體觀察者:實現抽象觀察者中定義的抽象方法,以便在具體目標類更改時及時更新自身內容。
:-: 
【圖片來源:http://c.biancheng.net/view/1390.html】
實現舉例:
~~~
package net.biancheng.c.observer;
import java.util.*;
public class ObserverPattern {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer obs1 = new ConcreteObserver1();
Observer obs2 = new ConcreteObserver2();
subject.add(obs1);
subject.add(obs2);
subject.notifyObserver();
}
}
//抽象目標
abstract class Subject {
protected List<Observer> observers = new ArrayList<Observer>();
//增加觀察者方法
public void add(Observer observer) {
observers.add(observer);
}
//刪除觀察者方法
public void remove(Observer observer) {
observers.remove(observer);
}
public abstract void notifyObserver(); //通知觀察者方法
}
//具體目標
class ConcreteSubject extends Subject {
public void notifyObserver() {
System.out.println("具體目標發生改變...");
System.out.println("--------------");
for (Object obs : observers) {
((Observer) obs).response();
}
}
}
//抽象觀察者
interface Observer {
void response(); //反應
}
//具體觀察者1
class ConcreteObserver1 implements Observer {
public void response() {
System.out.println("具體觀察者1作出反應!");
}
}
//具體觀察者1
class ConcreteObserver2 implements Observer {
public void response() {
System.out.println("具體觀察者2作出反應!");
}
}
~~~
注意事項:
1. 避免循環依賴
2. 避免順序執行時,某一觀察者錯誤導致系統卡頓,一般采用異步的方式。
JDK使用:
1. java.util.Observable和java.util.Observer接口定義了觀察者模式。
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper