最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之觀察者模式(Observer Pattern)詳解

 更新時(shí)間:2023年07月07日 10:54:34   作者:小威要向諸佬學(xué)習(xí)呀  
觀察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都能夠自動(dòng)地得到通知并進(jìn)行更新,本文將詳細(xì)的給大家介紹一下Java觀察者模式,需要的朋友可以參考下

觀察者模式概念

觀察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都能夠自動(dòng)地得到通知并進(jìn)行更新。這種模式也被稱(chēng)作是發(fā)布-訂閱(Publish/Subscribe)模式。

觀察者模式角色

觀察者模式包含以下角色:

抽象主題(Subject):它把所有觀察者對(duì)象的引用保存在一個(gè)聚集里,并提供了增加和刪除觀察者的方法。它可以是接口或抽象類(lèi)。

具體主題(Concrete Subject):它將有關(guān)狀態(tài)存入具體觀察者對(duì)象;當(dāng)它的狀態(tài)發(fā)生改變時(shí),向它的各個(gè)觀察者發(fā)出通知。

抽象觀察者(Observer):它是觀察者的抽象類(lèi),它定義了一個(gè)更新接口,使得在得到主題通知時(shí)更新自己。

具體觀察者(Concrete Observer):實(shí)現(xiàn)抽象觀察者所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。

觀察者模式代碼案例

觀察者模式的實(shí)現(xiàn)通常采取基于接口的編程方式,下面是一個(gè)使用 Java 實(shí)現(xiàn)觀察者模式的示例代碼:

// 抽象主題
public interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers();
}
// 具體主題
public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }
    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }
}
// 抽象觀察者
public interface Observer {
    void update(Subject subject);
}
// 具體觀察者
public class ConcreteObserver implements Observer {
    private int state;
    @Override
    public void update(Subject subject) {
        if (subject instanceof ConcreteSubject) {
            state = ((ConcreteSubject) subject).getState();
            System.out.println("State changed to " + state);
        }
    }
}
// 示例代碼
public class Example {
    public static void main(String[] args) {
        // 創(chuàng)建主題和觀察者
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver();
        Observer observer2 = new ConcreteObserver();
        // 注冊(cè)觀察者
        subject.attach(observer1);
        subject.attach(observer2);
        // 改變主題狀態(tài),觀察者將收到通知并更新自己的狀態(tài)
        subject.setState(1);
        subject.setState(2);
        // 注銷(xiāo)觀察者
        subject.detach(observer2);
        // 再次改變主題狀態(tài),此時(shí)只有 observer1 收到通知
        subject.setState(3);
    }
}

上面的示例代碼中,ConcreteSubject 作為具體主題,繼承了 Subject 接口并實(shí)現(xiàn)了其中的方法;ConcreteObserver 作為具體觀察者,實(shí)現(xiàn)了 Observer 接口中的方法。當(dāng)主題的狀態(tài)發(fā)生改變時(shí),會(huì)調(diào)用 notifyObservers() 方法通知所有注冊(cè)過(guò)的觀察者進(jìn)行更新。

觀察者模式小結(jié)

使用觀察者模式能夠建立松耦合的設(shè)計(jì),讓對(duì)象之間的依賴關(guān)系更加靈活,是一種我們?cè)夙?xiàng)目中常用的設(shè)計(jì)模式。

觀察者模式具有松耦合、可擴(kuò)展性強(qiáng)等優(yōu)點(diǎn),使得我們能夠在不影響主題和觀察者之間關(guān)系的前提下增加新的觀察者,從而在一定程度上提高了代碼的靈活性和可維護(hù)性。其缺點(diǎn)是需要考慮到并發(fā)問(wèn)題。

到此這篇關(guān)于Java設(shè)計(jì)模式之觀察者模式(Observer Pattern)詳解的文章就介紹到這了,更多相關(guān)Java 觀察者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java與Unix時(shí)間戳的相互轉(zhuǎn)換詳解

    Java與Unix時(shí)間戳的相互轉(zhuǎn)換詳解

    這篇文章主要為大家詳細(xì)介紹了Java與Unix時(shí)間戳的相互轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • mybatis-plus添加數(shù)據(jù)時(shí)id自增問(wèn)題及解決

    mybatis-plus添加數(shù)據(jù)時(shí)id自增問(wèn)題及解決

    這篇文章主要介紹了mybatis-plus添加數(shù)據(jù)時(shí)id自增問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot2.1 RESTful API項(xiàng)目腳手架(種子)項(xiàng)目

    SpringBoot2.1 RESTful API項(xiàng)目腳手架(種子)項(xiàng)目

    這篇文章主要介紹了SpringBoot2.1 RESTful API項(xiàng)目腳手架(種子)項(xiàng)目,用于搭建RESTful API工程的腳手架,只需三分鐘你就可以開(kāi)始編寫(xiě)業(yè)務(wù)代碼,不再煩惱于構(gòu)建項(xiàng)目與風(fēng)格統(tǒng)一,感興趣的小伙伴們可以參考一下
    2018-12-12
  • springcloud?整合?openfeign的方法

    springcloud?整合?openfeign的方法

    openFeign 是springcloud對(duì)Feign進(jìn)行了增強(qiáng),使得Feign支持了springmvc的注解,并整合了Ribbon和Eureka,從而讓Feign的使用更加方便,這篇文章主要介紹了springcloud?整合?openfeign,需要的朋友可以參考下
    2022-09-09
  • java.nio.file.WatchService?實(shí)時(shí)監(jiān)控文件變化的示例代碼

    java.nio.file.WatchService?實(shí)時(shí)監(jiān)控文件變化的示例代碼

    在?Java?語(yǔ)言中,從?JDK7?開(kāi)始,新增了java.nio.file.WatchService類(lèi),用來(lái)實(shí)時(shí)監(jiān)控文件的變化,這篇文章主要介紹了java.nio.file.WatchService?實(shí)時(shí)監(jiān)控文件變化,需要的朋友可以參考下
    2022-05-05
  • java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例

    java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例

    下面小編就為大家分享一篇java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • SpringBoot Admin之應(yīng)用監(jiān)控與告警配置方式

    SpringBoot Admin之應(yīng)用監(jiān)控與告警配置方式

    這篇文章主要介紹了SpringBoot Admin之應(yīng)用監(jiān)控與告警配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 淺談Java中的橋接方法與泛型的逆變和協(xié)變

    淺談Java中的橋接方法與泛型的逆變和協(xié)變

    對(duì)應(yīng)于Java當(dāng)中,協(xié)變對(duì)應(yīng)的就是<? extends XXX>,而逆變對(duì)應(yīng)的就是<? super XXX>,本文詳細(xì)的介紹了Java中的橋接方法與泛型的逆變和協(xié)變,感興趣的可以了解一下
    2022-04-04
  • Java中使用Socket發(fā)送Java對(duì)象實(shí)例

    Java中使用Socket發(fā)送Java對(duì)象實(shí)例

    這篇文章主要介紹了Java中使用Socket發(fā)送Java對(duì)象實(shí)例,本文使用對(duì)象流直接發(fā)送對(duì)象,本文同時(shí)給出代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • Maven項(xiàng)目打包時(shí)添加本地Jar包的操作步驟

    Maven項(xiàng)目打包時(shí)添加本地Jar包的操作步驟

    在 Maven 項(xiàng)目開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要引入本地 Jar 包的場(chǎng)景,比如使用未發(fā)布到中央倉(cāng)庫(kù)的第三方庫(kù)或者處理版本沖突的依賴項(xiàng),本文將詳細(xì)介紹如何通過(guò) Maven 命令將本地 Jar 包安裝到本地倉(cāng)庫(kù),并在項(xiàng)目中正確引用,需要的朋友可以參考下
    2025-05-05

最新評(píng)論

罗甸县| 长阳| 伊金霍洛旗| 高碑店市| 广平县| 资阳市| 开平市| 萍乡市| 广灵县| 侯马市| 元谋县| 亳州市| 和平县| 宿州市| 兴宁市| 张家川| 高邮市| 尚义县| 阿图什市| 博乐市| 灯塔市| 青川县| 兴安县| 新余市| 焦作市| 吉首市| 岳池县| 贵定县| 保靖县| 团风县| 洛南县| 莎车县| 随州市| 房山区| 宜宾县| 开平市| 香港 | 山丹县| 汉川市| 阜宁县| 红河县|