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

深入解析Java設(shè)計模式編程中觀察者模式的運用

 更新時間:2016年02月07日 10:20:54   作者:卡奴達(dá)摩  
這篇文章主要介紹了Java設(shè)計模式編程中觀察者模式的運用,觀察者模式主要是為了將對象進(jìn)行與被觀察者一樣的實現(xiàn),需要的朋友可以參考下

定義:定義對象間一種一對多的依賴關(guān)系,使得當(dāng)每一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并自動更新。
類型:行為類模式
類圖:

201627101722880.jpg (506×274)

在軟件系統(tǒng)中經(jīng)常會有這樣的需求:如果一個對象的狀態(tài)發(fā)生改變,某些與它相關(guān)的對象也要隨之做出相應(yīng)的變化。比如,我們要設(shè)計一個右鍵菜單的功能,只要在軟件的有效區(qū)域內(nèi)點擊鼠標(biāo)右鍵,就會彈出一個菜單;再比如,我們要設(shè)計一個自動部署的功能,就像eclipse開發(fā)時,只要修改了文件,eclipse就會自動將修改的文件部署到服務(wù)器中。這兩個功能有一個相似的地方,那就是一個對象要時刻監(jiān)聽著另一個對象,只要它的狀態(tài)一發(fā)生改變,自己隨之要做出相應(yīng)的行動。其實,能夠?qū)崿F(xiàn)這一點的方案很多,但是,無疑使用觀察者模式是一個主流的選擇。

觀察者模式的結(jié)構(gòu)
在最基礎(chǔ)的觀察者模式中,包括以下四個角色:
被觀察者:從類圖中可以看到,類中有一個用來存放觀察者對象的Vector容器(之所以使用Vector而不使用List,是因為多線程操作時,Vector在是安全的,而List則是不安全的),這個Vector容器是被觀察者類的核心,另外還有三個方法:attach方法是向這個容器中添加觀察者對象;detach方法是從容器中移除觀察者對象;notify方法是依次調(diào)用觀察者對象的對應(yīng)方法。這個角色可以是接口,也可以是抽象類或者具體的類,因為很多情況下會與其他的模式混用,所以使用抽象類的情況比較多。
觀察者:觀察者角色一般是一個接口,它只有一個update方法,在被觀察者狀態(tài)發(fā)生變化時,這個方法就會被觸發(fā)調(diào)用。
具體的被觀察者:使用這個角色是為了便于擴展,可以在此角色中定義具體的業(yè)務(wù)邏輯。
具體的觀察者:觀察者接口的具體實現(xiàn),在這個角色中,將定義被觀察者對象狀態(tài)發(fā)生變化時所要處理的邏輯。

觀察者模式實現(xiàn)示例
Subject接口

public interface Subject {
  public void registerObserver(Observer o);
  public void removeObserver(Observer o);
  public void notifyAllObservers();
}

Observer接口

public interface Observer {
  public void update(Subject s);
}

Hunter類實現(xiàn)了Subject接口

import java.util.ArrayList;
 
public class HeadHunter implements Subject{
 
  //define a list of users, such as Mike, Bill, etc.
  private ArrayList<Observer> userList;
  private ArrayList<String> jobs;
 
  public HeadHunter(){
    userList = new ArrayList<Observer>();
    jobs = new ArrayList<String>();
  }
 
  @Override
  public void registerObserver(Observer o) {
    userList.add(o);
  }
 
  @Override
  public void removeObserver(Observer o) {}
 
  @Override
  public void notifyAllObservers() {
    for(Observer o: userList){
      o.update(this);
    }
  }
 
  public void addJob(String job) {
    this.jobs.add(job);
    notifyAllObservers();
  }
 
  public ArrayList<String> getJobs() {
    return jobs;
  }
 
  public String toString(){
    return jobs.toString();
  }
}

JobSeeker是一個觀察者:

public class JobSeeker implements Observer {
 
  private String name;
 
  public JobSeeker(String name){
    this.name = name;
  }
  @Override
  public void update(Subject s) {
    System.out.println(this.name + " got notified!");
    //print job list
    System.out.println(s);
  }
}

開始使用:

public class Main {
  public static void main(String[] args) {
    HeadHunter hh = new HeadHunter();
    hh.registerObserver(new JobSeeker("Mike"));
    hh.registerObserver(new JobSeeker("Chris"));
    hh.registerObserver(new JobSeeker("Jeff"));
 
    //每次添加一個個job,所有找工作人都可以得到通知。
    hh.addJob("Google Job");
    hh.addJob("Yahoo Job");
  }
}

觀察者模式的優(yōu)點
        觀察者與被觀察者之間是屬于輕度的關(guān)聯(lián)關(guān)系,并且是抽象耦合的,這樣,對于兩者來說都比較容易進(jìn)行擴展。
        觀察者模式是一種常用的觸發(fā)機制,它形成一條觸發(fā)鏈,依次對各個觀察者的方法進(jìn)行處理。但同時,這也算是觀察者模式一個缺點,由于是鏈?zhǔn)接|發(fā),當(dāng)觀察者比較多的時候,性能問題是比較令人擔(dān)憂的。并且,在鏈?zhǔn)浇Y(jié)構(gòu)中,比較容易出現(xiàn)循環(huán)引用的錯誤,造成系統(tǒng)假死。
 
總結(jié)
       java語言中,有一個接口Observer,以及它的實現(xiàn)類Observable,對觀察者角色常進(jìn)行了實現(xiàn)。我們可以在jdk的api文檔具體查看這兩個類的使用方法。
       做過VC++、javascript DOM或者AWT開發(fā)的朋友都對它們的事件處理感到神奇,了解了觀察者模式,就對事件處理機制的原理有了一定的了解了。如果要設(shè)計一個事件觸發(fā)處理機制的功能,使用觀察者模式是一個不錯的選擇,AWT中的事件處理DEM(委派事件模型Delegation Event Model)就是使用觀察者模式實現(xiàn)的。

相關(guān)文章

  • mybatis實現(xiàn)獲取入?yún)⑹荓ist和Map的取值

    mybatis實現(xiàn)獲取入?yún)⑹荓ist和Map的取值

    這篇文章主要介紹了mybatis實現(xiàn)獲取入?yún)⑹荓ist和Map的取值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 一文帶你掌握java8中的reduce操作

    一文帶你掌握java8中的reduce操作

    reduce?操作是一種通用的歸約操作,它可以實現(xiàn)從?Stream?中生成一個值,其生成的值不是隨意的,而是根據(jù)指定的計算模型,下面我們就來深入了解下java8中的reduce操作吧
    2023-12-12
  • maven依賴版本沖突如何處理

    maven依賴版本沖突如何處理

    文章主要介紹了Maven依賴版本沖突的原因以及如何處理版本沖突的方法,包括使用exclusions排除依賴和使用dependencyManagement鎖定版本號
    2025-01-01
  • Java中輸入輸出方式詳細(xì)講解

    Java中輸入輸出方式詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于Java中輸入輸出方式的相關(guān)資料,Java輸入輸出是指使用java提供的一些類和方法來實現(xiàn)數(shù)據(jù)的輸入和輸出,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 使用springCloud+nacos集成seata1.3.0搭建過程

    使用springCloud+nacos集成seata1.3.0搭建過程

    這篇文章主要介紹了使用springCloud+nacos集成seata1.3.0搭建過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Java8如何從一個list中獲取某一元素集合

    Java8如何從一個list中獲取某一元素集合

    這篇文章主要介紹了Java8如何從一個list中獲取某一元素集合,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring-ImportSelector接口功能使用案例

    Spring-ImportSelector接口功能使用案例

    ImportSelector接口是至spring中導(dǎo)入內(nèi)部類或者外部類的核心接口,只需要其定義的方法內(nèi)返回需要創(chuàng)建bean的class字符串就好了,這篇文章主要介紹了Spring-ImportSelector接口功能介紹,需要的朋友可以參考下
    2023-09-09
  • springboot動態(tài)調(diào)整日志級別的操作大全

    springboot動態(tài)調(diào)整日志級別的操作大全

    這篇文章主要介紹了springboot動態(tài)調(diào)整日志級別的方法,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • java this的應(yīng)用方法解析

    java this的應(yīng)用方法解析

    這篇文章主要介紹了java this的應(yīng)用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot通過注解下載任意對象

    SpringBoot通過注解下載任意對象

    下載功能應(yīng)該是比較常見的功能了,雖然一個項目里面可能出現(xiàn)的不多,但是基本上每個項目都會有,而且有些下載功能其實還是比較繁雜的,這篇文章主要介紹了SpringBoot一個注解就能幫你下載任意對象,需要的朋友可以參考下
    2023-08-08

最新評論

阿拉善左旗| 威海市| 柘城县| 定襄县| 珲春市| 安丘市| 拜泉县| 成安县| 嘉义县| 宾川县| 宜章县| 寻乌县| 玛曲县| 乐陵市| 政和县| 科技| 聂拉木县| 荔浦县| 卓尼县| 库伦旗| 井冈山市| 阳原县| 武威市| 望奎县| 威海市| 黎川县| 宁阳县| 武隆县| 兴文县| 万山特区| 贵定县| 梓潼县| 嘉祥县| 根河市| 同德县| 浪卡子县| 遂平县| 保定市| 秭归县| 晋中市| 大荔县|