我的Java設計模式 觀察者模式

2021-09-11 12:35:04 字數 2684 閱讀 4612

相信大家都有看過《喜洋洋與灰太狼》,說的是灰太狼和羊族的「鬥爭」,而每次的結果都是灰太狼一飛沖天,伴隨著一句「我還會回來的......」。為灰太狼感到悲哀,抓不到羊,在家也被老婆平底鍋虐待。灰太狼為什麼會這麼背?

很簡單,灰太狼本身就有「暴露行蹤」的屬性,羊咩咩就能知曉灰太狼要幹嘛,不背才怪呢。

為了幫助灰太狼擺脫被老婆平底鍋抽的悲劇,發起了「解救灰太狼」的行動,必須要知道觀察者模式

觀察者模式又叫做發布-訂閱模式,定義了物件間一對多的依賴關係,使得當物件狀態發生變化時,所有依賴它的物件都會收到通知並且自動更新自己。

1)被觀察者需要持有乙個或者多個觀察者物件。

2)系統中乙個模組的變化,某些模組也會跟隨著變化。

從上面的uml可以看出來,觀察者模式設計到的角色有如下四個:

- 抽象被觀察者角色:定義了動態增加、刪除以及通知觀察者物件的方法,職責就是管理和通知觀察者。持有觀察者物件的集合。

- 具體被觀察者角色:一般繼承抽象被觀察者,實現自己本身的業務邏輯,當狀態發生改變時發起通知。

- 抽象觀察者角色:提供乙個介面,定義了觀察者收到通知時更新自己的方法。

- 具體觀察者角色:實現抽象觀察者介面,處理不同具體觀察者的不同業務邏輯。

灰太狼具有被觀察者屬性,喜洋洋這些羊咩咩一直都在觀察者灰太狼,所以羊咩咩們是觀察者。ok,角色確定了,看看具體是怎麼實現的...

抽象被觀察者**如下:

public abstract class subject 

/*** 刪除觀察者

** @param observer

*/public void dettach(observer observer)

/*** 通知所有觀察者

*/public void notifyobserver

() }

}複製**

灰太狼是具體被觀察者,繼承抽象被觀察者,**如下:

public class wolf extends subject 

}複製**

抽象觀察者**如下:

public inte***ce observer 

複製**

喜羊羊是具體觀察者,實現抽象觀察者,**如下:

public class pleasantsheep implements observer

/*** 具體業務邏輯

*/@override

public void update(string msg)

}複製**

接下來看客戶端如何把觀察者模式跑起來,**如下:

public class client 

}複製**

執行客戶端**,結果如下:

增加了觀察者:喜羊羊

灰太狼:我要搞事情了

喜羊羊收到通知:灰太狼要搞事情了

看到了吧,灰太狼這不是自找虐嗎!搞事情還要發通知,活該被平底鍋拍飛。灰太狼不止通知了喜羊羊,還通知了懶羊羊。

懶羊羊也是具體觀察者,**如下:

public class lazysheep implements observer 

@override

public void update(string msg)

}複製**

客戶端**如下:

public class client 

}複製**

上面客戶端**建立了乙個懶羊羊觀察者,新增了觀察者集合中,這樣懶羊羊也會受到通知,執行結果如下:

增加了觀察者:喜羊羊

增加了觀察者:懶羊羊

灰太狼:我要搞事情了

喜羊羊收到通知:灰太狼要搞事情了

懶羊羊收到通知:灰太狼要搞事情了

那如何幫助灰太狼擺脫這個命運呢,把觀察者從集合中移除就ok了,**如下:

public class client 

}複製**

再次執行客戶端,結果如下:

增加了觀察者:喜羊羊

增加了觀察者:懶羊羊

灰太狼:我要搞事情了

喜羊羊收到通知:灰太狼要搞事情了

懶羊羊收到通知:灰太狼要搞事情了

刪除了觀察者:喜羊羊

灰太狼:我要搞事情了

懶羊羊收到通知:灰太狼要搞事情了

可以看到,把喜羊羊從觀察者集合中移除了,它就不會再收到通知。

1)觀察者和被觀察者之間抽象耦合。觀察者模式容易擴充套件,被觀察者只持有觀察者集合,並不需要知道具體觀察者內部的實現。

2)物件之間的保持高度的協作。當被觀察者發生變化時,所有被觀察者都會通知到,然後做出相應的動作。

1)如果觀察者太多,被觀察者通知觀察者消耗的時間很多,影響系統的效能。

2)當觀察者集合中的某一觀察者錯誤時就會導致系統卡殼,因此一般會採用非同步方式。

跟**模式對比:觀察者模式和**模式主要區別在它們功能不一樣,觀察者模式強調的是被觀察者反饋結果,而**模式是同根負責做同樣的事情。

,下回分解,再見。

java設計模式 觀察者模式

本例以貓和老鼠來講解觀察者,首先定義觀察者為 老鼠和主人,被觀察者為貓,如下 public inte ce observer public class event public string getname public class mouse implements observer public ...

Java設計模式 觀察者模式

在物件之間定義一對多的依賴關係,這樣一來,當乙個物件改變狀態,依賴它的物件都會收到通知,並自動更新。比如有乙個天氣的資料來源,和需要獲取天氣資料的觀察者。天氣資料不定時更新。而觀察者也是隨時訂閱和取消訂閱天氣資料來源。在訂閱時,希望每次天氣資料更新時觀察者都可以獲取資訊。天氣資料來源作為被觀察的主題...

Java設計模式 觀察者模式

觀察者模式是乙個使用率非常高的的模式,它是一套訂閱 發布系統,這個模式最重要的作用就是將訂閱者和被訂閱者解耦。定義物件間一種對多種的依賴關係,使得每當乙個物件改變狀態,則所有依賴於它的物件都會得到通知。subject 抽象主題類,也就是被觀察者 observable 把所有觀察者物件儲存在乙個集合裡...