Java觀察者模式例子
觀察者模式是一種行為設(shè)計(jì)模式。觀察者模式的用途是,當(dāng)你對(duì)一個(gè)對(duì)象的狀態(tài)感興趣,希望在它每次發(fā)生變化時(shí)獲得通知。在觀察者模式中,觀察另外一個(gè)對(duì)象狀態(tài)的對(duì)象叫做Observer觀察者,被觀察的對(duì)象叫著Subject被觀察者。
觀察者模式 Observer
觀察者模式定義了一種一對(duì)多的依賴(lài)關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象。
這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,讓它們能夠自動(dòng)更新自己。
觀察者模式的組成
抽象主題角色:把所有對(duì)觀察者對(duì)象的引用保存在一個(gè)集合中,每個(gè)抽象主題角色都可以有任意數(shù)量的觀察者。抽象主題提供一個(gè)接口,可以增加和刪除觀察者角色。一般用一個(gè)抽象類(lèi)和接口來(lái)實(shí)現(xiàn)。
抽象觀察者角色:為所有具體的觀察者定義一個(gè)接口,在得到主題的通知時(shí)更新自己。
具體主題角色:在具體主題內(nèi)部狀態(tài)改變時(shí),給所有登記過(guò)的觀察者發(fā)出通知。具體主題角色通常用一個(gè)子類(lèi)實(shí)現(xiàn)。
具體觀察者角色:該角色實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。通常用一個(gè)子類(lèi)實(shí)現(xiàn)。如果需要,具體觀察者角色可以保存一個(gè)指向具體主題角色的引用。
程序?qū)嵗?br />
通過(guò)程序?qū)嵗齺?lái)說(shuō)明觀察者模式:
首先定義抽象的觀察者:
//抽象觀察者角色
public interface Watcher
{
public void update(String str);
}
然后定義抽象的主題角色,即抽象的被觀察者,在其中聲明方法(添加、移除觀察者,通知觀察者):
//抽象主題角色,watched:被觀察
public interface Watched
{
public void addWatcher(Watcher watcher);
public void removeWatcher(Watcher watcher);
public void notifyWatchers(String str);
}
然后定義具體的觀察者:
public class ConcreteWatcher implements Watcher
{
@Override
public void update(String str)
{
System.out.println(str);
}
}
之后是具體的主題角色:
import java.util.ArrayList;
import java.util.List;
public class ConcreteWatched implements Watched
{
// 存放觀察者
private List<Watcher> list = new ArrayList<Watcher>();
@Override
public void addWatcher(Watcher watcher)
{
list.add(watcher);
}
@Override
public void removeWatcher(Watcher watcher)
{
list.remove(watcher);
}
@Override
public void notifyWatchers(String str)
{
// 自動(dòng)調(diào)用實(shí)際上是主題進(jìn)行調(diào)用的
for (Watcher watcher : list)
{
watcher.update(str);
}
}
}
編寫(xiě)測(cè)試類(lèi):
public class Test
{
public static void main(String[] args)
{
Watched girl = new ConcreteWatched();
Watcher watcher1 = new ConcreteWatcher();
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();
girl.addWatcher(watcher1);
girl.addWatcher(watcher2);
girl.addWatcher(watcher3);
girl.notifyWatchers("開(kāi)心");
}
}
以上所述是小編給大家分享的Java觀察者模式例子,希望大家喜歡。
- Java中的觀察者模式實(shí)例講解
- 使用Java8實(shí)現(xiàn)觀察者模式的方法(上)
- android開(kāi)發(fā)中使用java觀察者模式
- java觀察者模式實(shí)現(xiàn)和java觀察者模式演化
- 實(shí)例解析觀察者模式及其在Java設(shè)計(jì)模式開(kāi)發(fā)中的運(yùn)用
- 使用 Java8 實(shí)現(xiàn)觀察者模式的方法(下)
- Java設(shè)計(jì)模式之觀察者模式(Observer模式)介紹
- 用Java設(shè)計(jì)模式中的觀察者模式開(kāi)發(fā)微信公眾號(hào)的例子
- 全面解析Java8觀察者模式
- 23種設(shè)計(jì)模式(13)java觀察者模式
相關(guān)文章
MybatisPlus關(guān)聯(lián)查詢(xún)的完美實(shí)現(xiàn)方案
我們?cè)陧?xiàng)目開(kāi)發(fā)的時(shí)候,難免會(huì)遇到連表查詢(xún)的操作,所以下面這篇文章主要給大家介紹了關(guān)于MybatisPlus關(guān)聯(lián)查詢(xún)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
Java初學(xué)者之五子棋游戲?qū)崿F(xiàn)教程
這篇文章主要為大家詳細(xì)介紹了Java初學(xué)者之五子棋游戲?qū)崿F(xiàn)教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
詳解Java如何實(shí)現(xiàn)加密或者解密PDF文檔
PDF文檔加密是一種用于保護(hù)文件內(nèi)容的功能。這篇文章主要介紹了Java實(shí)現(xiàn)加密或者解密PDF文檔的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
TreeSet詳解和使用示例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
TreeSet是一個(gè)有序的集合,它的作用是提供有序的Set集合。這篇文章主要介紹了TreeSet使用示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Spring BeanPostProcessor接口使用詳解
本篇文章主要介紹了Spring BeanPostProcessor接口使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Java concurrency集合之CopyOnWriteArraySet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
CopyOnWriteArraySet基于CopyOnWriteArrayList實(shí)現(xiàn),其唯一的不同是在add時(shí)調(diào)用的是CopyOnWriteArrayList的addIfAbsent(若沒(méi)有則增加)方法2017-06-06

