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

Java設計模式中觀察者模式詳解

 更新時間:2022年11月24日 08:47:31   作者:lpf_wei  
觀察者模式是極其重要的一個設計模式,也是我?guī)啄觊_發(fā)過程中使用最多的設計模式,本文首先概述觀察者模式的基本概念和Demo實現(xiàn),接著是觀察者模式在Java和Spring中的應用,最后是對觀察者模式的應用場景和優(yōu)缺點進行總結

編程是一門藝術,大批量的改動顯然是非常丑陋的做法,用心的琢磨寫的代碼讓它變的更美觀。

在現(xiàn)實世界中,許多對象并不是獨立存在的,其中一個對象的行為發(fā)生改變可能會導致一個或者多個其他對象的行為也發(fā)生改變。例如,某種商品的物價上漲時會導致部分商家高興,而消費者傷心;還有,當我們開車到交叉路口時,遇到紅燈會停,遇到綠燈會行。股票價格與股民、微信公眾號與微信用戶、天氣預報與聽眾等。

在軟件世界也是這樣,例如MVC 模式中的模型與視圖的關系;事件模型中的事件源與事件處理者。所有這些,如果用觀察者模式來實現(xiàn)就非常方便。

1.觀察者設計模式定義

觀察者(Observer)模式:指多個對象間存在一對多的依賴關系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。這種模式有時又稱作發(fā)布-訂閱模式、模型-視圖模式,它是對象行為型模式。

2.觀察者設計模式優(yōu)點與不足

觀察者模式是一種對象行為型模式,其主要優(yōu)點:

  • 降低了目標與觀察者之間的耦合關系,兩者之間是抽象耦合關系。符合依賴倒置原則。
  • 目標與觀察者之間建立了一套觸發(fā)機制。

它的主要不足:

  • 目標與觀察者之間的依賴關系并沒有完全解除,而且有可能出現(xiàn)循環(huán)引用。
  • 當觀察者對象很多時,通知的發(fā)布會花費很多時間,影響程序的效率。

3.觀察者設計模式實現(xiàn)思路

實現(xiàn)觀察者模式時要注意具體目標對象和具體觀察者對象之間不能直接調(diào)用,否則將使兩者之間緊密耦合起來,這違反了面向?qū)ο蟮脑O計原則。

觀察者模式的主要角色如下。

  • 抽象主題(Subject)角色:也叫抽象目標類,它提供了一個用于保存觀察者對象的聚集類和增加、刪除觀察者對象的方法,以及通知所有觀察者的抽象方法。
  • 具體主題(Concrete Subject)角色:也叫具體目標類,它實現(xiàn)抽象目標中的通知方法,當具體主題的內(nèi)部狀態(tài)發(fā)生改變時,通知所有注冊過的觀察者對象。
  • 抽象觀察者(Observer)角色:它是一個抽象類或接口,它包含了一個更新自己的抽象方法,當接到具體主題的更改通知時被調(diào)用。
  • 具體觀察者(Concrete Observer)角色:實現(xiàn)抽象觀察者中定義的抽象方法,以便在得到目標的更改通知時更新自身的狀態(tài)。

4.觀察者設計模式應用實例

/**
 * 觀察者
 */
public interface Observer {
    /**
     * 更新
     */
    void update();
}
/**
 * 注意事項  被觀察者  被觀察者發(fā)出通知
 */
public abstract class Attentions {
    /**
     * 觀察者列表
     */
    protected List<Observer> observers = new ArrayList();
    /**
     * 添加觀察者
     * @param observer
     */
    public void add(Observer observer) {
        observers.add(observer);
    }
    /**
     * 取消關注
     * @param observer
     */
    public void remove(Observer observer) {
        observers.remove(observer);
    }
    /**
     * 被觀察者發(fā)出通知 通知所有觀察者  觀察者可以做出相應的行為
     */
    public abstract void notifyObservers();
}
/**
 * 觀察者  各種各樣的觀察者
 */
public class SoulMasterObserver implements Observer {
    private String name;
    public SoulMasterObserver(String name){
        this.name = name;
    }
    /**
     * 觀察者接收到通知做一些事情
     */
    @Override
    public void update() {
        System.out.println(name + "收到作戰(zhàn)通知,趕往嘉陵關");
    }
}
public class MangoAttention extends Attentions{
    @Override
    public void notifyObservers() {
        //遍歷觀察者集合
        for(Observer obs : observers) {
            obs.update();
        }
    }
    /*通知觀察者*/
    public void perform(){
        this.notifyObservers();
    }
}
public class ObserverClient {
    public static void main(String[] args) {
        MangoAttention attentions = new MangoAttention();//目標
        attentions.add(new SoulMasterObserver("唐三"));
        attentions.add(new SoulMasterObserver("馬紅俊"));
        attentions.add(new SoulMasterObserver("小舞"));
        attentions.add(new SoulMasterObserver("寧榮榮"));
        attentions.perform();
    }
}

觀察者設計模式,首先需要定義一個觀察者的接口,這個接口定義了做什么一個行為,

然后定義一個被觀察者,這個里邊包含了一個觀察者的集合以及添加和刪除觀察者的方法以及一個通知的方法。

然后定義具體的觀察者,實現(xiàn)具體的行動,當被通知之后就可以行動了。

具體的被觀察者實現(xiàn)通知的一個方法,遍歷所以的觀察者,通知觀察者執(zhí)行動作。

另外由于jkd本身提供了用于支持觀察者設計模式實現(xiàn)的兩個類,可以不用自己實現(xiàn)接口和抽象類,直接借助jdk提供的Observer和Obserable就可以,jdk提供的做的更好線程安全啥的都做了。

public class SoulMaster implements Observer {
    private String name;
    public SoulMaster(String name){
        this.name = name;
    }
    @Override
    public void update(Observable o, Object arg) {
        System.out.println(name + "收到作戰(zhàn)通知,趕往嘉陵關");
    }
}
public class War extends Observable {
    private String name;
    public War(String name){
        this.name = name;
    }
    public void perform(){
        /*先設置改變*/
        this.setChanged();
        /*然后通知*/
        this.notifyObservers();
    }
}
public class JdkObserverClient {
    public static void main(String[] args) {
        War war = new War(":戰(zhàn)爭");
        war.addObserver(new SoulMaster("唐三"));
        war.addObserver(new SoulMaster("馬紅俊"));
        war.addObserver(new SoulMaster("小舞"));
        war.addObserver(new SoulMaster("寧榮榮"));
        war.perform();
    }
}

可見通過jdk提供的兩個類實現(xiàn)觀察者,更加簡潔。

5.觀察者設計模式模式的應用場景

在軟件系統(tǒng)中,當系統(tǒng)一方行為依賴另一方行為的變動時,可使用觀察者模式松耦合聯(lián)動雙方,使得一方的變動可以通知到感興趣的另一方對象,從而讓另一方對象對此做出響應。

觀察者模式適合以下幾種情形:

  • 對象間存在一對多關系,一個對象的狀態(tài)發(fā)生改變會影響其他對象。
  • 當一個抽象模型有兩個方面,其中一個方面依賴于另一方面時,可將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復用。
  • 實現(xiàn)類似廣播機制的功能,不需要知道具體收聽者,只需分發(fā)廣播,系統(tǒng)中感興趣的對象會自動接收該廣播。
  • 多層級嵌套使用,形成一種鏈式觸發(fā)機制,使得事件具備跨域(跨越兩種觀察者類型)通知。

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

相關文章

  • Spring Boot 快速搭建微服務框架詳細教程

    Spring Boot 快速搭建微服務框架詳細教程

    SpringBoot是為了簡化Spring應用的創(chuàng)建、運行、調(diào)試、部署等而出現(xiàn)的,使用它可以做到專注于Spring應用的開發(fā),而無需過多關注XML的配置。本文重點給大家介紹Spring Boot 快速搭建微服務框架詳細教程,需要的的朋友參考下吧
    2017-09-09
  • Kotlin 內(nèi)聯(lián)函數(shù)詳解及實例

    Kotlin 內(nèi)聯(lián)函數(shù)詳解及實例

    這篇文章主要介紹了Kotlin 內(nèi)聯(lián)函數(shù)詳解及實例的相關資料,需要的朋友可以參考下
    2017-06-06
  • Java插入排序算法實現(xiàn)方法例子

    Java插入排序算法實現(xiàn)方法例子

    所謂排序,是將一組數(shù)據(jù)按照特定順序重新排列的過程,穩(wěn)定排序算法中相同鍵值的元素排序后保持原有順序,直接插入排序和希爾排序是插入排序的兩種形式,這篇文章主要介紹了Java插入排序算法實現(xiàn)的相關資料,需要的朋友可以參考下
    2024-10-10
  • Java編程中的檢查型異常與非檢查型異常分析

    Java編程中的檢查型異常與非檢查型異常分析

    這篇文章主要介紹了Java編程中的未檢查型異常與非檢查型異常,以及異常的處理方式,需要的朋友可以參考下
    2017-09-09
  • Java對稱加密工作模式原理詳解

    Java對稱加密工作模式原理詳解

    這篇文章主要介紹了Java對稱加密工作模式原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • SpringSecurity定義多個過濾器鏈的操作代碼

    SpringSecurity定義多個過濾器鏈的操作代碼

    Spring?Security?是?Spring家族中的一個安全管理框架。相比與另外一個安全框架Shiro,它提供了更豐富的功能,社區(qū)資源也比Shiro豐富,今天通過本文給大家介紹SpringSecurity定義多個過濾器鏈的實例,感興趣的朋友跟隨小編一起看看吧
    2023-04-04
  • 實例代碼講解JAVA多線程

    實例代碼講解JAVA多線程

    這篇文章主要介紹講解JAVA多線程的有關知識,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • Java網(wǎng)絡通信基礎編程(必看篇)

    Java網(wǎng)絡通信基礎編程(必看篇)

    下面小編就為大家?guī)硪黄狫ava網(wǎng)絡通信基礎編程(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java多線程 CompletionService

    Java多線程 CompletionService

    這篇文章主要介紹了Java多線程 CompletionService,CompletionService用于提交一組Callable任務,其take方法返回已完成的一個Callable任務對應的Future對象,需要的朋友可以參考一下文章詳細內(nèi)容
    2021-10-10
  • Spring IOC:CreateBean環(huán)節(jié)中的流程轉(zhuǎn)換

    Spring IOC:CreateBean環(huán)節(jié)中的流程轉(zhuǎn)換

    Spring IOC 體系是一個很值得深入和研究的結構 , 只有自己真正的讀一遍 , 才能有更好的理解.這篇文章主要說明一下 CreateBean 整個環(huán)節(jié)中的大流程轉(zhuǎn)換 , 便于查找問題的原因
    2021-05-05

最新評論

禄丰县| 绥阳县| 吕梁市| 凌源市| 通州区| 大关县| 定边县| 新郑市| 新郑市| 奉节县| 咸丰县| 泰宁县| 龙泉市| 沧源| 忻州市| 林芝县| 麻栗坡县| 磐石市| 磐石市| 灵山县| 淄博市| 科技| 万州区| 门头沟区| 阿拉尔市| 上思县| 台湾省| 库伦旗| 泗阳县| 晴隆县| 黔西县| 普安县| 周至县| 元阳县| 龙口市| 陆丰市| 当雄县| 阳山县| 大足县| 泸定县| 长汀县|