觀察者模式(Observer Pattern)
觀察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,用于在對(duì)象之間建立一種一對(duì)多的依賴關(guān)系,使得當(dāng)一個(gè)對(duì)象狀態(tài)改變時(shí),其相關(guān)依賴對(duì)象都能得到通知并自動(dòng)更新。
概念:
- 主題(Subject):也稱為被觀察者,它維護(hù)一個(gè)觀察者列表,并提供添加、刪除和通知觀察者的方法。
- 觀察者(Observer):它定義了一個(gè)接口,當(dāng)主題狀態(tài)改變時(shí)會(huì)被通知,并執(zhí)行相應(yīng)的更新操作。
- 具體主題(ConcreteSubject):實(shí)現(xiàn)主題接口,當(dāng)狀態(tài)發(fā)生變化時(shí),通知其注冊(cè)的觀察者。
- 具體觀察者(ConcreteObserver):實(shí)現(xiàn)觀察者接口,定義在接收到通知時(shí)所進(jìn)行的更新操作。
優(yōu)點(diǎn):
- 解耦:觀察者模式能夠讓主題與觀察者之間解耦,使得它們可以獨(dú)立地進(jìn)行擴(kuò)展和變化。
- 易擴(kuò)展:可以靈活地增加新的觀察者,無需修改主題代碼。
- 通知機(jī)制:當(dāng)對(duì)象之間存在一對(duì)多關(guān)系時(shí),觀察者模式能夠提供一種簡單的通知機(jī)制,保證相關(guān)對(duì)象及時(shí)更新。
缺點(diǎn):
- 過多的更新:如果觀察者較多且更新操作較復(fù)雜,可能導(dǎo)致性能問題。
- 循環(huán)依賴:觀察者和主題之間的循環(huán)依賴需謹(jǐn)慎處理,避免導(dǎo)致循環(huán)調(diào)用。
使用場(chǎng)景:
- 當(dāng)一個(gè)對(duì)象的改變需要同時(shí)改變其他對(duì)象,并且不知道有多少對(duì)象需要改變時(shí),可以考慮使用觀察者模式。
- 當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴于另一個(gè)方面,將這兩者封裝在獨(dú)立的對(duì)象中可以使用觀察者模式實(shí)現(xiàn)解耦。
示例案例:新聞發(fā)布訂閱系統(tǒng)
假設(shè)我們有一個(gè)新聞發(fā)布訂閱系統(tǒng),包含以下角色:文章來源:http://www.zghlxwxcb.cn/news/detail-607008.html
- 主題(Subject):新聞發(fā)布者,維護(hù)一個(gè)訂閱者列表,并提供添加、刪除和通知訂閱者的方法。
- 觀察者(Observer):新聞?dòng)嗛喺?,定義了接收新聞更新的方法。
- 具體主題(ConcreteSubject):具體的新聞發(fā)布者,繼承主題接口,實(shí)現(xiàn)添加、刪除和通知訂閱者的方法。
- 具體觀察者(ConcreteObserver):具體的新聞?dòng)嗛喺?,?shí)現(xiàn)觀察者接口,定義接收新聞更新的方法。
// 主題接口
interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String news);
}
// 觀察者接口
interface Observer {
void update(String news);
}
// 具體主題
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String news) {
for (Observer observer : observers) {
observer.update(news);
}
}
}
// 具體觀察者
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String news) {
System.out.println(name + " received news: " + news);
}
}
// 測(cè)試代碼
public class ObserverPatternExample {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Subscriber 1");
Observer observer2 = new ConcreteObserver("Subscriber 2");
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notifyObservers("Breaking News: COVID-19 Update!");
subject.removeObserver(observer2);
subject.notifyObservers("Sports News: Team A wins the championship!");
}
}
在上面的例子中,新聞發(fā)布者和訂閱者之間的關(guān)系被解耦,當(dāng)新聞發(fā)布者發(fā)布新聞時(shí),所有訂閱者都會(huì)收到通知并進(jìn)行相應(yīng)的更新操作。文章來源地址http://www.zghlxwxcb.cn/news/detail-607008.html
到了這里,關(guān)于設(shè)計(jì)模式【行為型】-- 觀察者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!