" />

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

Java中常用的設計模式之觀察者模式詳解

 更新時間:2022年02月27日 11:39:07   作者:Asurplus、  
這篇文章主要為大家詳細介紹了Java中常用的設計模式之觀察者模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

優(yōu)點

1.觀察者和被觀察者是抽象耦合的。

2.建立一套觸發(fā)機制。

缺點

1.如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。

2.如果在觀察者和觀察目標之間有循環(huán)依賴的話,觀察目標會觸發(fā)它們之間進行循環(huán)調用,可能導致系統(tǒng)崩潰。

3.觀察者模式?jīng)]有相應的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標發(fā)生了變化。

使用場景

一個抽象模型有兩個方面,其中一個方面依賴于另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復用。

一個對象的改變將導致其他一個或多個對象也發(fā)生改變,而不知道具體有多少對象將發(fā)生改變,可以降低對象之間的耦合度。

一個對象必須通知其他對象,而并不知道這些對象是誰。

需要在系統(tǒng)中創(chuàng)建一個觸發(fā)鏈,A對象的行為將影響B(tài)對象,B對象的行為將影響C對象……,可以使用觀察者模式創(chuàng)建一種鏈式觸發(fā)機制。

注意事項

1.JAVA 中已經(jīng)有了對觀察者模式的支持類。

2.避免循環(huán)引用。

3.如果順序執(zhí)行,某一觀察者錯誤會導致系統(tǒng)卡殼,一般采用異步方式。

一、實現(xiàn)方式

1、觀察者抽象類

package com.asurplus.common.observe;
/**
 * 觀察者
 */
public abstract class Observer {
    protected Subject subject;
    /**
     * 發(fā)布事件
     */
    public abstract void update();
}

2、第一個觀察者

package com.asurplus.common.observe;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Observer1 extends Observer {
    public Observer1(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }
    @Override
    public void update() {
        log.info("觀察者 1 收到通知:{}", this.subject.getState());
    }
}

3、第二個觀察者

package com.asurplus.common.observe;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Observer2 extends Observer {
    public Observer2(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }
    @Override
    public void update() {
        log.info("觀察者 2 收到通知:{}", this.subject.getState());
    }
}

4、第三個觀察者

package com.asurplus.common.observe;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Observer3 extends Observer {
    public Observer3(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }
    @Override
    public void update() {
        log.info("觀察者 3 收到通知:{}", this.subject.getState());
    }
}

5、定義主題

package com.asurplus.common.observe;
import java.util.ArrayList;
import java.util.List;
/**
 * 主題
 */
public class Subject {
    /**
     * 觀察者列表
     */
    private List<Observer> observers = new ArrayList<>();
    /**
     * 標志
     */
    private int state;
    public int getState() {
        return state;
    }
    /**
     * 標識被改變
     *
     * @param state
     */
    public void setState(int state) {
        this.state = state;
        // 通知所有觀察者
        notifyAllObservers();
    }
    /**
     * 添加進接收者列表
     *
     * @param observer
     */
    public void attach(Observer observer) {
        observers.add(observer);
    }
    /**
     * 通知所有人被改變
     */
    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

類似于消息發(fā)布一樣,有多個接收者,當標志位被改變的時候,通知多個接收者。

二、測試

package com.asurplus.common.observe;
public class TestMain {
    public static void main(String[] args) {
        // 創(chuàng)建主題
        Subject subject = new Subject();
        // 添加觀察者
        new Observer1(subject);
        new Observer2(subject);
        new Observer3(subject);
        // 改變標志
        subject.setState(10);
    }
}

輸出結果

在這里插入圖片描述

可以看出,三個接收者都收到了事件通知,從而實現(xiàn)了我們的觀察者模式。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!   

相關文章

  • 關于RequestMapping注解的作用說明

    關于RequestMapping注解的作用說明

    這篇文章主要介紹了關于RequestMapping注解的作用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java PreparedStatement用法詳解

    Java PreparedStatement用法詳解

    這篇文章主要介紹了Java PreparedStatement用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • 一文掌握Java中的JWT

    一文掌握Java中的JWT

    這篇文章主要介紹了Java中的JWT,JWT的本質就是一個字符串,它是將用戶信息保存到一個Json字符串中,然后進行編碼后得到一個JWT?token,對JWT相關知識感興趣的朋友一起看看吧
    2022-06-06
  • IDEA2020.1使用LeetCode插件運行并調試本地樣例的方法詳解

    IDEA2020.1使用LeetCode插件運行并調試本地樣例的方法詳解

    這篇文章主要介紹了IDEA2020.1使用LeetCode插件運行并調試本地樣例的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • springboot冪等切片的實現(xiàn)

    springboot冪等切片的實現(xiàn)

    本文主要介紹了springboot冪等切片的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java多線程與優(yōu)先級詳細解讀

    Java多線程與優(yōu)先級詳細解讀

    這篇文章主要給大家介紹了關于Java中方法使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • SpringMVC中控制器返回JSON數(shù)據(jù)的實現(xiàn)

    SpringMVC中控制器返回JSON數(shù)據(jù)的實現(xiàn)

    本文主要介紹了SpringMVC中控制器返回JSON數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Java組件FileUpload上傳文件實現(xiàn)代碼

    Java組件FileUpload上傳文件實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了Java組件FileUpload上傳文件實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 淺談Android開發(fā)中項目的文件結構及規(guī)范化部署建議

    淺談Android開發(fā)中項目的文件結構及規(guī)范化部署建議

    這篇文章主要介紹了Android開發(fā)中項目的文件結構及規(guī)范化部署建議,組織好代碼文件的結構有利于維護團隊合作的效率,需要的朋友可以參考下
    2016-03-03
  • Spring + Spring Boot + MyBatis + MongoDB的整合教程

    Spring + Spring Boot + MyBatis + MongoDB的整合教程

    這篇文章主要給大家介紹了關于Spring + Spring Boot + MyBatis + MongoDB的整合教程,文中通過圖文以及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-12-12

最新評論

汉阴县| 黑龙江省| 鄢陵县| 大渡口区| 碌曲县| 五常市| 莱阳市| 精河县| 鄂伦春自治旗| 凤山市| 明溪县| 乐清市| 绿春县| 商都县| 邵阳县| 长汀县| 陈巴尔虎旗| 潞西市| 清新县| 平和县| 玉田县| 双鸭山市| 武鸣县| 东山县| 游戏| 台中市| 密云县| 交城县| 乌拉特前旗| 成武县| 和平区| 商河县| 竹山县| 特克斯县| 上林县| 朔州市| 历史| 延安市| 益阳市| 铜鼓县| 泸西县|