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

Java學(xué)習(xí)筆記之觀察者模式

 更新時(shí)間:2017年11月18日 11:17:20   作者:神仙果  
這篇文章主要為大家詳細(xì)介紹了Java學(xué)習(xí)筆記之觀察者模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文為大家分享了Java設(shè)計(jì)模式之觀察者模式,供大家參考,具體內(nèi)容如下

1、初步認(rèn)識(shí)

觀察者模式的定義:

  在對(duì)象之間定義了一對(duì)多的依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài),依賴它的對(duì)象會(huì)收到通知并自動(dòng)更新。

大白話:

  其實(shí)就是發(fā)布訂閱模式,發(fā)布者發(fā)布信息,訂閱者獲取信息,訂閱了就能收到信息,沒(méi)訂閱就收不到信息。

2、這個(gè)模式的結(jié)構(gòu)圖

3、可以看到,該模式包含四個(gè)角色

抽象被觀察者角色:也就是一個(gè)抽象主題,它把所有對(duì)觀察者對(duì)象的引用保存在一個(gè)集合中,每個(gè)主題都可以有任意數(shù)量的觀察者。抽象主題提供一個(gè)接口,可以增加和刪除觀察者角色。一般用一個(gè)抽象類和接口來(lái)實(shí)現(xiàn)。
抽象觀察者角色:為所有的具體觀察者定義一個(gè)接口,在得到主題通知時(shí)更新自己。
具體被觀察者角色:也就是一個(gè)具體的主題,在集體主題的內(nèi)部狀態(tài)改變時(shí),所有登記過(guò)的觀察者發(fā)出通知。
具體觀察者角色:實(shí)現(xiàn)抽象觀察者角色所需要的更新接口,一邊使本身的狀態(tài)與制圖的狀態(tài)相協(xié)調(diào)。

4、使用場(chǎng)景例子

  有一個(gè)微信公眾號(hào)服務(wù),不定時(shí)發(fā)布一些消息,關(guān)注公眾號(hào)就可以收到推送消息,取消關(guān)注就收不到推送消息。

5、觀察者模式具體實(shí)現(xiàn)

1)、定義一個(gè)抽象被觀察者接口

package com.jstao.observer;

/***
 * 抽象被觀察者接口
 * 聲明了添加、刪除、通知觀察者方法
 * @author jstao
 *
 */
public interface Observerable {
  
  public void registerObserver(Observer o);
  public void removeObserver(Observer o);
  public void notifyObserver();
  
}

2)、定義一個(gè)抽象觀察者接口

package com.jstao.observer;

/***
 * 抽象觀察者
 * 定義了一個(gè)update()方法,當(dāng)被觀察者調(diào)用notifyObservers()方法時(shí),觀察者的update()方法會(huì)被回調(diào)。
 * @author jstao
 *
 */
public interface Observer {
  public void update(String message);
}

3)、定義被觀察者,實(shí)現(xiàn)了Observerable接口,對(duì)Observerable接口的三個(gè)方法進(jìn)行了具體實(shí)現(xiàn),同時(shí)有一個(gè)List集合,用以保存注冊(cè)的觀察者,等需要通知觀察者時(shí),遍歷該集合即可。

package com.jstao.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 被觀察者,也就是微信公眾號(hào)服務(wù)
 * 實(shí)現(xiàn)了Observerable接口,對(duì)Observerable接口的三個(gè)方法進(jìn)行了具體實(shí)現(xiàn)
 * @author jstao
 *
 */
public class WechatServer implements Observerable {
  
  //注意到這個(gè)List集合的泛型參數(shù)為Observer接口,設(shè)計(jì)原則:面向接口編程而不是面向?qū)崿F(xiàn)編程
  private List<Observer> list;
  private String message;
  
  public WechatServer() {
    list = new ArrayList<Observer>();
  }
  
  @Override
  public void registerObserver(Observer o) {
    
    list.add(o);
  }
  
  @Override
  public void removeObserver(Observer o) {
    if(!list.isEmpty())
      list.remove(o);
  }

  //遍歷
  @Override
  public void notifyObserver() {
    for(int i = 0; i < list.size(); i++) {
      Observer oserver = list.get(i);
      oserver.update(message);
    }
  }
  
  public void setInfomation(String s) {
    this.message = s;
    System.out.println("微信服務(wù)更新消息: " + s);
    //消息更新,通知所有觀察者
    notifyObserver();
  }

}

4)、定義具體觀察者,微信公眾號(hào)的具體觀察者為用戶User

package com.jstao.observer;

/**
 * 觀察者
 * 實(shí)現(xiàn)了update方法
 * @author jstao
 *
 */
public class User implements Observer {

  private String name;
  private String message;
  
  public User(String name) {
    this.name = name;
  }
  
  @Override
  public void update(String message) {
    this.message = message;
    read();
  }
  
  public void read() {
    System.out.println(name + " 收到推送消息: " + message);
  }
  
}

5)、編寫一個(gè)測(cè)試類

首先注冊(cè)了三個(gè)用戶,ZhangSan、LiSi、WangWu。公眾號(hào)發(fā)布了一條消息"PHP是世界上最好用的語(yǔ)言!",三個(gè)用戶都收到了消息。

用戶ZhangSan看到消息后頗為震驚,果斷取消訂閱,這時(shí)公眾號(hào)又推送了一條消息,此時(shí)用戶ZhangSan已經(jīng)收不到消息,其他用戶

還是正常能收到推送消息。

package com.jstao.observer;

public class Test {
  
  public static void main(String[] args) {
    WechatServer server = new WechatServer();
    
    Observer userZhang = new User("ZhangSan");
    Observer userLi = new User("LiSi");
    Observer userWang = new User("WangWu");
    
    server.registerObserver(userZhang);
    server.registerObserver(userLi);
    server.registerObserver(userWang);
    server.setInfomation("PHP是世界上最好用的語(yǔ)言!");
    
    System.out.println("----------------------------------------------");
    server.removeObserver(userZhang);
    server.setInfomation("JAVA是世界上最好用的語(yǔ)言!");
    
  }
}

測(cè)試結(jié)果:

6、小結(jié)

這個(gè)模式是松偶合的。改變主題或觀察者中的一方,另一方不會(huì)受到影像。
JDK中也有自帶的觀察者模式。但是被觀察者是一個(gè)類而不是接口,限制了它的復(fù)用能力。
在JavaBean和Swing中也可以看到觀察者模式的影子。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SSH框架網(wǎng)上商城項(xiàng)目第24戰(zhàn)之Struts2中處理多個(gè)Model請(qǐng)求的方法

    SSH框架網(wǎng)上商城項(xiàng)目第24戰(zhàn)之Struts2中處理多個(gè)Model請(qǐng)求的方法

    這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第24戰(zhàn)之Struts2中處理多個(gè)Model請(qǐng)求的方法,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java遞歸造成的堆棧溢出問(wèn)題及解決方案

    Java遞歸造成的堆棧溢出問(wèn)題及解決方案

    在Java中,遞歸造成的堆棧溢出問(wèn)題通常是因?yàn)檫f歸調(diào)用的深度過(guò)大,導(dǎo)致調(diào)用??臻g不足,解決這類問(wèn)題的一種常見(jiàn)方法是使用非遞歸的方式重寫算法,即使用迭代替代遞歸,需要的朋友可以參考下
    2024-08-08
  • Java throw Exception實(shí)現(xiàn)異常轉(zhuǎn)換

    Java throw Exception實(shí)現(xiàn)異常轉(zhuǎn)換

    這篇文章主要介紹了Java throw Exception實(shí)現(xiàn)異常轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • JPA findById方法和getOne方法的區(qū)別說(shuō)明

    JPA findById方法和getOne方法的區(qū)別說(shuō)明

    這篇文章主要介紹了JPA findById方法和getOne方法的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2021-08-08
  • Java實(shí)現(xiàn)指定線程執(zhí)行順序的三種方式示例

    Java實(shí)現(xiàn)指定線程執(zhí)行順序的三種方式示例

    這篇文章主要介紹了Java實(shí)現(xiàn)指定線程執(zhí)行順序的三種方式,包括通過(guò)共享對(duì)象鎖加上可見(jiàn)變量,通過(guò)主線程Join()以及通過(guò)線程執(zhí)行時(shí)Join()等三種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2019-01-01
  • Java實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件的方法詳解

    Java實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以借鑒一下
    2022-11-11
  • MyBatis直接執(zhí)行SQL的工具SqlMapper

    MyBatis直接執(zhí)行SQL的工具SqlMapper

    今天小編就為大家分享一篇關(guān)于MyBatis直接執(zhí)行SQL的工具SqlMapper,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • spring mvc配置bootstrap教程

    spring mvc配置bootstrap教程

    這篇文章主要為大家詳細(xì)介紹了spring mvc配置bootstrap,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 關(guān)于@Transactional事務(wù)嵌套使用方式

    關(guān)于@Transactional事務(wù)嵌套使用方式

    Spring框架通過(guò)@Transactional注解來(lái)管理事務(wù),它可以作用于類和方法上,用于聲明事務(wù)的屬性,如傳播行為、隔離級(jí)別、超時(shí)時(shí)間等,Spring事務(wù)是基于AOP實(shí)現(xiàn)的,它在運(yùn)行時(shí)為加了@Transactional注解的方法或類創(chuàng)建代理
    2024-11-11
  • JDBC如何通過(guò)SSL方式連接MySQL

    JDBC如何通過(guò)SSL方式連接MySQL

    文章介紹了如何配置MySQL以支持SSL連接,并通過(guò)JDBC進(jìn)行安全連接,主要內(nèi)容包括查看MySQL SSL支持、創(chuàng)建SSL連接用戶、配置用戶是否強(qiáng)制使用SSL、JDBC配置導(dǎo)入證書以及使用Go編寫一個(gè)簡(jiǎn)單的HTTP文件服務(wù)器來(lái)提供SSL證書
    2025-02-02

最新評(píng)論

江孜县| 锡林浩特市| 象山县| 陆河县| 泸定县| 崇义县| 新巴尔虎左旗| 东丰县| 汝城县| 柏乡县| 博爱县| 拜城县| 扶余县| 蓬莱市| 龙胜| 西乌珠穆沁旗| 蓬安县| 剑川县| 阜平县| 集安市| 光泽县| 义马市| 陵水| 尖扎县| 波密县| 通山县| 乐业县| 长垣县| 厦门市| 项城市| 成武县| 怀集县| 息烽县| 婺源县| 寻乌县| 三江| 宿松县| 茂名市| 灵石县| 织金县| 德格县|