1. 概念
定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí)约巷,所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新姓蜂。
2. 使用場(chǎng)景
觀察者模式就是我們最常使用的按鈕事件的模式,舉例來(lái)說(shuō)忠聚,我們軟件上一個(gè)button赂蕴,我們點(diǎn)擊一下觸發(fā)了click事件柳弄,當(dāng)click時(shí)可能會(huì)觸發(fā)后續(xù)的多個(gè)操作,按鈕就是被依賴的對(duì)象睡腿,點(diǎn)擊以后依賴于它的對(duì)象得到通知并做出反應(yīng)语御,即被自動(dòng)更新峻贮。
3. 類圖
屏幕快照 2021-01-15 下午10.06.44.png
4. 代碼示例
下面的代碼講述這么的事兒席怪,一個(gè)小孩睡醒了就會(huì)哭,他身邊的爸爸纤控、媽媽和狗狗的反應(yīng)...
- 事件:
abstract class Event<T> {
abstract T getSource();
}
class wakeUpEvent extends Event<Child>{
long timestamp;
String loc;
Child source;
public wakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
@Override
Child getSource() {
return source;
}
}
- 接口及實(shí)現(xiàn)類:
interface Observer {
void actionOnWakeUp(wakeUpEvent event);
}
class Dad implements Observer {
public void feed() {
System.out.println("dad feeding...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
feed();
}
}
class Mum implements Observer {
public void hug() {
System.out.println("mum hugging...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
hug();
}
}
class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
wang();
}
}
- 事件源:
/**
* 有很多時(shí)候挂捻,觀察者需要根據(jù)事件的具體情況來(lái)進(jìn)行處理
* 大多數(shù)時(shí)候,我們處理事件的時(shí)候船万,需要事件源對(duì)象
* 事件也可以形成繼承體系
*/
class Child {
private boolean cry = false;
private List<Observer> observers = new ArrayList<>();
{
observers.add(new Dad());
observers.add(new Mum());
observers.add(new Dog());
observers.add((e)->{
System.out.println("ppp");
});
//hook callback function
}
public boolean isCry() {
return cry;
}
public void wakeUp() {
cry = true;
// 將事件源傳遞進(jìn)去刻撒,有時(shí)候是為各個(gè)處理事件的對(duì)象對(duì)于不同的事件源做出不同的處理方式
wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);
for(Observer o : observers) {
o.actionOnWakeUp(event);
}
}
}
- 場(chǎng)景類:
public class Main {
public static void main(String[] args) {
Child c = new Child();
// do sth
c.wakeUp();
}
}
5. 總結(jié)
以下全是觀察者模式范疇
- Observer
- Listener
- Hook(鉤子函數(shù))
- Callback
————————————————————
坐標(biāo)帝都,白天上班族耿导,晚上是知識(shí)的分享者
如果讀完覺(jué)得有收獲的話声怔,歡迎點(diǎn)贊加關(guān)注