什么是觀察者模式?
觀察者模式(又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)變化時,會通知所有的觀察者對象,使他們能夠自動更新自己。
觀察者模式的角色:
Subject:抽象主題(被觀察者),每一個主題可以有多個觀察者,并將所有觀察者對象的引用保存在一個集合里,被觀察者提供一個接口,可以增加和刪除觀察者角色
ConcreteSubject:具體主題,將有關狀態(tài)存入具體觀察者對象,在主題發(fā)生改變時,給所有的觀察者發(fā)出通知
Observer:抽象觀察者,為所有的具體觀察者定義一個更新接口,該接口的作用是在收到主題的通知時能夠及時的更新自己
ConcreteObserver:具體觀察者,實現(xiàn)抽象觀察者角色定義的更新接口,以便使本身的狀態(tài)與主題狀態(tài)相協(xié)調(diào)。如果需要,具體觀察者角色可以保存一個指向具體主題角色的引用。
參考來自設計模式(五)觀察者模式,作者:劉望舒
觀察者模式的使用場景:
觀察者模式是一種對象行為型模式,它通常用于以下場景:
- 消息服務器系統(tǒng)。
- 社交媒體平臺。
- 郵件系統(tǒng)。
- 圖形界面應用程序。
- 游戲。
- 實現(xiàn)團隊協(xié)作,提高工作效率。
- 觀察者模式可以在不同對象之間創(chuàng)建有效關系,從而更有效地開發(fā)高質(zhì)量軟件。
具體實現(xiàn):
假設有這么一個場景:我是B站up主,有很多粉絲關注我,我發(fā)視頻了,他們就會點贊我,我發(fā)癲了(說些不好的話)他們就會取關我。
在這種場景下,就很使用觀察者模式,粉絲們關注我,根據(jù)我的狀態(tài)而動態(tài)地做出反應。
觀察者的接口
public interface MyObserver {
void execute(String upName);
}
觀察者對象
public class fans implements MyObserver {
private String name;
public fans(String name){
this.name = name;
}
// 根據(jù)msg動態(tài)地執(zhí)行方法
@Override
public void execute(String msg) {
if("更新了".equals(msg)){
System.out.println(this.name+"點贊了你");
}
if("發(fā)癲了".equals(msg)){
System.out.println(this.name+"舉報了你");
}
}
}
被觀察者接口
public interface SupObject {
// 將粉絲增加在通知列表
void add(MyObserver myObserver);
// 將粉絲刪除出通知列表
void delete(MyObserver myObserver);
// 通知
void notify(String upName);
}
被觀察者對象
public class up implements SupObject{
List<MyObserver> notifyList = new ArrayList<>();
@Override
public void add(MyObserver myObserver) {
notifyList.add(myObserver);
}
@Override
public void delete(MyObserver myObserver) {
notifyList.remove(myObserver);
}
@Override
public void notify(String msg) {
notifyList.forEach(t-> t.execute(msg));
}
}
執(zhí)行器
public class client {
public static void main(String[] args) {
fans fans1 = new fans("小約翰可汗");
fans fans2 = new fans("CSGO玩機器");
fans fans3 = new fans("徐云流浪中國");
up up = new up();
up.add(fans1);
up.add(fans2);
up.add(fans3);
up.notify("更新了");
}
}
效果:
觀察者模式的優(yōu)缺點:
優(yōu)點
解除耦合,讓耦合的雙方都依賴于抽象,從而使得各自的變換都不會影響另一邊的變換。
缺點
在應用觀察者模式時需要考慮一下開發(fā)效率和運行效率的問題,程序中包括一個被觀察者、多個觀察者,開發(fā)、調(diào)試等內(nèi)容會比較復雜,而且在Java中消息的通知一般是順序執(zhí)行,那么一個觀察者卡頓,會影響整體的執(zhí)行效率,在這種情況下,一般會采用異步實現(xiàn)。
觀察者模式和發(fā)布訂閱模式的不同:
通過上面的代碼,可能回產(chǎn)生這樣的疑問?
這不是“被觀察者”主動發(fā)送消息給“觀察者”的嗎?這么叫做觀察者模式呢?主被動關系是不是搞反了?
其實觀察者模式也叫做發(fā)布訂閱模式。
比如《heah in first》中,就曾這么寫
Publishers + Subscribers = Observer Pattern
文章來源:http://www.zghlxwxcb.cn/news/detail-637150.html
但是!他們還是有差別的
在發(fā)布訂閱模式里,發(fā)布者,并不會直接通知訂閱者,換句話說,發(fā)布者和訂閱者,彼此互不相識。
但在觀察者模式中,觀察者與被觀察者是直接通信的。
這就是他們的差別:
觀察者模式主打一個松耦合,但是他們還是耦合的。
但是發(fā)布訂閱模式,完完全全的松開了!文章來源地址http://www.zghlxwxcb.cn/news/detail-637150.html
到了這里,關于【設計模式】觀察者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!