Java設(shè)計(jì)模式之觀察者模式(Observer Pattern)詳解
觀察者模式概念
觀察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都能夠自動(dòng)地得到通知并進(jìn)行更新。這種模式也被稱作是發(fā)布-訂閱(Publish/Subscribe)模式。
觀察者模式角色
觀察者模式包含以下角色:
抽象主題(Subject):它把所有觀察者對(duì)象的引用保存在一個(gè)聚集里,并提供了增加和刪除觀察者的方法。它可以是接口或抽象類。
具體主題(Concrete Subject):它將有關(guān)狀態(tài)存入具體觀察者對(duì)象;當(dāng)它的狀態(tài)發(fā)生改變時(shí),向它的各個(gè)觀察者發(fā)出通知。
抽象觀察者(Observer):它是觀察者的抽象類,它定義了一個(gè)更新接口,使得在得到主題通知時(shí)更新自己。
具體觀察者(Concrete Observer):實(shí)現(xiàn)抽象觀察者所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。
觀察者模式代碼案例
觀察者模式的實(shí)現(xiàn)通常采取基于接口的編程方式,下面是一個(gè)使用 Java 實(shí)現(xiàn)觀察者模式的示例代碼:
// 抽象主題
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers();
}
// 具體主題
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObservers();
}
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this);
}
}
}
// 抽象觀察者
public interface Observer {
void update(Subject subject);
}
// 具體觀察者
public class ConcreteObserver implements Observer {
private int state;
@Override
public void update(Subject subject) {
if (subject instanceof ConcreteSubject) {
state = ((ConcreteSubject) subject).getState();
System.out.println("State changed to " + state);
}
}
}
// 示例代碼
public class Example {
public static void main(String[] args) {
// 創(chuàng)建主題和觀察者
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver();
Observer observer2 = new ConcreteObserver();
// 注冊(cè)觀察者
subject.attach(observer1);
subject.attach(observer2);
// 改變主題狀態(tài),觀察者將收到通知并更新自己的狀態(tài)
subject.setState(1);
subject.setState(2);
// 注銷觀察者
subject.detach(observer2);
// 再次改變主題狀態(tài),此時(shí)只有 observer1 收到通知
subject.setState(3);
}
}上面的示例代碼中,ConcreteSubject 作為具體主題,繼承了 Subject 接口并實(shí)現(xiàn)了其中的方法;ConcreteObserver 作為具體觀察者,實(shí)現(xiàn)了 Observer 接口中的方法。當(dāng)主題的狀態(tài)發(fā)生改變時(shí),會(huì)調(diào)用 notifyObservers() 方法通知所有注冊(cè)過(guò)的觀察者進(jìn)行更新。
觀察者模式小結(jié)
使用觀察者模式能夠建立松耦合的設(shè)計(jì),讓對(duì)象之間的依賴關(guān)系更加靈活,是一種我們?cè)夙?xiàng)目中常用的設(shè)計(jì)模式。
觀察者模式具有松耦合、可擴(kuò)展性強(qiáng)等優(yōu)點(diǎn),使得我們能夠在不影響主題和觀察者之間關(guān)系的前提下增加新的觀察者,從而在一定程度上提高了代碼的靈活性和可維護(hù)性。其缺點(diǎn)是需要考慮到并發(fā)問(wèn)題。
到此這篇關(guān)于Java設(shè)計(jì)模式之觀察者模式(Observer Pattern)詳解的文章就介紹到這了,更多相關(guān)Java 觀察者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息示例
這篇文章主要介紹了Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息,結(jié)合實(shí)例形式分析了Java微信公眾號(hào)獲取微信用戶信息相關(guān)原理、步驟與操作注意事項(xiàng),需要的朋友可以參考下2019-10-10
spring + shiro + cas 實(shí)現(xiàn)sso單點(diǎn)登錄的示例代碼
本篇文章主要介紹了spring + shiro + cas 實(shí)現(xiàn)sso單點(diǎn)登錄的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09
SpringBoot 策略模式實(shí)現(xiàn)切換上傳文件模式
策略模式是指有一定行動(dòng)內(nèi)容的相對(duì)穩(wěn)定的策略名稱,這篇文章主要介紹了SpringBoot 策略模式 切換上傳文件模式,需要的朋友可以參考下2023-11-11
Spring中@Autowired注解作用在方法上和屬性上說(shuō)明
這篇文章主要介紹了Spring中@Autowired注解作用在方法上和屬性上說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Spring?Boot?3?整合?MinIO?實(shí)現(xiàn)分布式文件存儲(chǔ)的全過(guò)程
本文介紹了如何使用SpringBoot3和MinIO實(shí)現(xiàn)分布式文件存儲(chǔ),通過(guò)MinIO的分布式對(duì)象存儲(chǔ)系統(tǒng),可以解決傳統(tǒng)單機(jī)文件存儲(chǔ)方案在面對(duì)大規(guī)模數(shù)據(jù)和高并發(fā)訪問(wèn)時(shí)的不足,文章詳細(xì)講解了MinIO的安裝、配置和使用,感興趣的朋友一起看看吧2025-03-03
使用JPA支持多參數(shù)列表查詢(參數(shù)可能為空)
這篇文章主要介紹了使用JPA支持多參數(shù)列表查詢(參數(shù)可能為空),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05

