国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

淺析JDK Observer設計模式

開發 后端
JDK Observer設計模式的介紹旨在拋磚引玉,從JDK Observer設計模式德介紹和存在的困難等等多角度分析問題,希望對你有所幫助。

Java中JDK自帶的JDK Observer設計模式的實現是一個范例,有助于我們在設計模式的思維上有所突破。目前設計模式的介紹性文章越來越多,但設計模式的研究性文章仍然比較欠缺,這著實讓人覺得有點遺憾。本文旨在拋磚引玉。

1.JDK Observer設計模式概要

JDK Observer設計模式在GOF里屬于行為設計模式。JDK里提供的observer設計模式的實現由java.util.Observable類和java.util.Observer接口組成。從名字上可以清楚的看出兩者在Observer 設計模式中分別扮演的角色:Observer是觀察者角色,Observable是被觀察目標(subject)角色。

Observable是一個封裝subject基本功能的類,比如注冊observer(attach功能),注銷observer(detatch功能)等。這些功能是任何一個扮演observerable角色的類都需要實現的,從這一點上來講,JDK里將這些通用功能專門封裝在一個類里,顯得合情合理。通常情況下,我們的類只要從Observerable類派生就可以稱為observerable角色類,使用非常簡單。

2.使用JDK Observer設計模式存在的困難

但我們不得不注意到,在項目實際開發當中,情況往往要復雜得多。java不支持多繼承特性在很多時候是阻礙我們使用JDK Observer設計模式的絆腳石。比如說,我們設計的一個類已經是某個類的派生類,在這種情況下同時想讓它扮演Observerable角色將變得麻煩。如何實現“多繼承”的效果是擺在我們面前的一大難題。下面我們首先分析一下Observable類。

3.JDK Observable類“觸發通知”的原理

Observable必須“有變化”才能觸發通知observer這一任務,這是它的本質體現。查看源碼便可知一二。

Observerable部分源碼如下:

  1.   //……省略……  
  2.   private boolean changed = false;  
  3.   //……省略……  
  4.   public void notifyObservers(Object arg) {  
  5.   //……省略……  
  6.     Object[] arrLocal;  
  7.     synchronized (this) {  
  8.      //……省略……  
  9.      if (!changed)  
  10.       return;  
  11.       arrLocal = obs.toArray();  
  12.       clearChanged();  
  13.     }  
  14.  
  15.   //……省略……  
  16.   protected synchronized void setChanged() {  
  17.    changed = true;  
  18.   }  
  19.    
  20.   protected synchronized void clearChanged() {  
  21.    changed = false;  
  22.   } 

正如粗的斜體標注部分所示,在notifyObservers(Object arg) 方法里if (!changed) return;語句告訴我們,若changed屬性值為false,將直接返回,根本不會觸發通知操作。并且我們注意到changed 屬性被初始化為false,這將意味著如果我們不主動設置changed屬性為true,將不會有任何變化,也就是說根本起不到“通知”作用。因此,設置changed屬性的值是我們應用jdk observer 設計模式的關鍵所在。那么如何才能設置changed屬性呢?從源碼可以看出,唯一的入口是通過setChanged()。下面我們分析一下changed屬性及相關的方法setChanged()和clearChanged()。

4.Observable類的分析

Observable#changed屬性的初始值為false,這很容易理解,不再詳細陳述。細心的讀者可能會注意到跟changed屬性有關的兩個方法setChanged()和clearChanged(),它們的修飾符都是protected。想強調的是,是protected,而不是public。但這樣是否有其必要性和合理性?答案是肯定的。在前面的分析中,我已經提到,setChanged()方法是設置changed的唯一入口,它的修飾符定義為protected,就意味著通過定義Observable的對象,再設置changed屬性將變得不可能。從這個意義上說,要想應用observer設計模式,必須繼承Observable類方可。關于這一點,下文還會提及。但是,為什么不能定義成public?這似乎難以理解。因為定義成public,我們不就可以很方便地設置changed屬性的值嗎?為了弄清楚這個問題,我們還是看一下Observable里的相關的代碼:

  1.   //……省略……  
  2.   public void notifyObservers(Object arg) {  
  3.   //……省略……  
  4.    for (int i = arrLocal.length-1; i>=0; i--)  
  5.     ((Observer)arrLocal[i]).update(this, arg);  
  6.   } 

    
這段代碼表達的意思是說找出所有已注冊的Observer,再逐個進行“通知”,通過調用Observer#update(Observable,Object)方法進行通知。我們看到,update 第一個參數是this,我們同時還必須注意到,這段代碼是Observable類里的代碼。這就相當于是在一再強調,發出“通知”的,必須是observable自己(Observable類或者其派生類),其它任何類都不行。這就意味著我們的observable類繼承Observable類是必要的,因為如果不繼承,而采用組合的話,將無法保證能傳遞好this。換句話說,采用組合的方式使用Observable類,將變得幾乎沒有任何意義。同時,修飾符定義為protected,可以確保是在Obsrvable里進行觸發通知的,不會在其它任何地方進行通知,這顯得內斂性很強。如果將setChanged()修飾符定義為public,將無法保證正確“傳遞this”的硬性要求,這不符合“只有observalbe才能直接或間接通知observer”這一observable設計模式的硬性要求。由此我們可見一斑,jdk的很多理念的思想性是多么的強。

5.解決使用observer設計模式存在的困難

借助adapter設計模式(詳見本人發表的adapter設計模式相關文章)和java支持多接口特性基本可以解決“多繼承”問題。基本思想是結合繼承/實現和組合來達到效果。在上面的分析中,我們已經知道,Observable類必須繼承使用,不能組合使用,因此我們只需要將需扮演成observerable角色的類裝扮成adapter角色,將該類原繼承的類裝扮成adaptee角色即可。示例代碼如下:

  1.   //欲充當observable角色的類的原來的代碼:  
  2.   public class MyObject extends BaseObject {  
  3.    public MyObject() {  
  4.     public void method1(){}  
  5.    }  
  6.   }  
  7.  
  8.   //充當observable角色后的代碼:  
  9.   public class MyObject extends Observable {  
  10.    private BaseObject baseObject = null;  
  11.     public MyObject(BaseObject baseObject) {  
  12.      this.baseObject = baseObject;  
  13.     }  
  14.   } 

6.JDK Observer注意事項:

如果上例中的BaseObject也用到需要傳遞“this”的方法,那么上面的組合使用方法將有可能失效。這種情況是最糟糕的情況。此時可以考慮在BaseObject類這些“瓶頸”地方盡量采用接口代替類(包括抽象類)來解決。

那么JDK Observer設計模式就介紹到這里,但是很多的設計模式的思路還是要舉一反三慢慢提高。

【編輯推薦】

  1. JDK1.6在LINUX下的安裝配置
  2. JDK1.5中新的語言特征淺析
  3. 在JDK7 b50中將實現正則表達式命名捕獲組
  4. JDK日志框架介紹及其主要功能淺析
  5. JDK日志框架之自定義日志Handler淺析
責任編輯:仲衡 來源: CSDN博客
相關推薦

2009-08-18 11:03:31

Observer設計模

2009-08-26 10:24:04

C# Observer

2012-01-18 10:47:38

ibmdw

2009-06-29 17:39:31

JSP設計模式

2022-09-04 21:08:50

響應式設計Resize

2024-01-09 09:06:13

2010-07-14 09:01:07

架構設計

2009-04-29 09:06:18

C#設計模式Adapter

2009-07-09 11:02:37

JDK5.0內置工具

2009-07-08 14:06:22

ClassLoaderJDK源碼

2009-07-08 17:59:51

JDK JRE

2010-11-26 16:17:48

設計模式JDK

2019-04-24 09:43:46

代碼開發工具

2012-08-27 10:52:20

.NET架構觀察者模式

2024-08-16 13:59:00

2009-07-07 15:53:02

JDK日志

2009-07-08 17:02:11

JDK實現調用攔截器

2009-07-08 15:31:40

JDK 6.0web service

2009-07-08 12:53:29

JDK源碼Java.lang.B

2009-07-07 15:14:56

JDK日志STAF
點贊
收藏

51CTO技術棧公眾號

国产网站在线| 久久一区二区精品| 粉嫩av一区二区三区免费野| 久久香蕉国产线看观看99| 久久精品国产久精国产| 国产在线播放观看| 亚洲欧美成人在线| 欧美日韩成人综合天天影院| 色综合天天视频在线观看| 黑人欧美xxxx| 欧美喷潮久久久xxxxx| 欧美一二三四区在线| 亚洲宅男天堂在线观看无病毒| 五月天一区二区三区| 91一区二区在线观看| 日韩欧美高清| 三级成人在线| 欧美爱爱视频| 国产一区调教| 欧美久久久久| 亚洲第一区色| 极品日韩av| 亚洲永久在线| 久久国产一二区| 国内外成人在线| 国产精品中文字幕日韩精品| 懂色av一区二区三区免费看| 精品久久久久久最新网址| 一区二区三区精品99久久| 亚洲成人自拍| 久久综合色播| 国产精品久久久久久久龚玥菲 | 亚洲一区影院| 综合操久久久| 国产精品18毛片一区二区| 91淫黄看大片| 日本aⅴ写真网站免费| 午夜在线不卡| av在线中文| 欧美粗大gay| 日本欧美韩国国产| 国产精品亚洲综合色区韩国| 狠狠色狠狠色综合日日91app| 99riav久久精品riav| 新片速递亚洲合集欧美合集| 99re精彩视频| 欧美xxxx免费虐| 小嫩嫩12欧美| 高清日韩电视剧大全免费| 国产精品美女一区二区| 亚洲福中文字幕伊人影院| 欧美丝袜美女中出在线| 欧美变态口味重另类| 中文字幕av日韩| 国产精品看片资源| 大地资源第二页在线观看高清版| 欧美女同在线观看| av资源中文在线天堂| 久久成人福利| 久久99精品国产麻豆不卡| 亚洲欧美日韩国产中文在线| 日韩欧美成人一区| 国产精品久久久久国产a级| 人人妻人人做人人爽| a天堂中文在线| 日韩成人动漫在线观看| 国产精品欧美综合在线| 日韩成人性视频| 国产精品久久久久不卡| 在线观看污视频| segui88久久综合9999| 一区二区在线看| 99蜜桃臀久久久欧美精品网站| 青青操综合网| 一区二区三区在线高清| 日本一区二区三区www| 黄色欧美网站| 亚洲乱码中文字幕综合| 美女国内精品自产拍在线播放| 日韩欧美视频第二区| 成人精品动漫| 免费观看日韩av| 精品久久久久久久久久久| 成人做爰www免费看视频网站| www.99riav| 青青青免费在线视频| 国产精品毛片va一区二区三区| 精品婷婷色一区二区三区蜜桃| 最近2018中文字幕免费在线视频| 久久久久av| 久久久99精品久久| 精品国产视频在线| 久久久久久久久久久久久久国产| 伊人色综合一区二区三区影院视频| 一本久久综合| 欧美视频自拍偷拍| 激情小说综合区| 亚洲乱亚洲乱妇| 亚洲深深色噜噜狠狠爱网站| 丁香六月综合激情| 精品国产乱码久久久久久老虎| 免费国产在线精品一区二区三区| 欧美videossex| 国产精品小仙女| 欧美大片在线观看一区| 黄瓜视频免费观看在线观看www| 成人高潮成人免费观看| 国产在线播精品第三| 亚洲欧美在线播放| 免费网站成人| 国产一区二区精品在线观看| 成人444kkkk在线观看| 无码人妻aⅴ一区二区三区日本| heyzo高清在线| 狠狠色丁香久久婷婷综合丁香| 一区二区亚洲精品国产| 四虎黄色影院| 精品在线你懂的| 欧美美女一区二区| 国产精品jizz在线观看麻豆| 亚洲精品高清无码视频| 久9re热视频这里只有精品| 国产精品xx| 天堂va欧美ⅴa亚洲va一国产| 成人欧美一区二区三区视频网页| 亚洲日本一区二区三区在线不卡| 波多野结衣在线网站| 黑丝美女一区二区| 一个色综合网站| 亚洲视频电影| 精品精品国产三级a∨在线| 亚洲一本大道在线| 国产一级黄色录像片| 成人h动漫精品一区二区器材| 日本韩国一区二区三区视频| 2018中文字幕第一页| 国产精品普通话对白| 免费97视频在线精品国自产拍| 在线观看av网页| 亚洲精品在线二区| 日本在线精品视频| 91精品91| 久久久久久久97| 成年人黄视频在线观看| 国产乱子伦视频一区二区三区| 国产精品中文字幕久久久| 视频二区在线| 国产精品啊啊啊| 国产成人av网址| 丝袜+亚洲+另类+欧美+变态| 日韩视频免费| 国产欧美欧洲在线观看| 麻豆精品一区| 亚洲欧洲高清在线| 亚洲人成亚洲精品| 欧美s码亚洲码精品m码| 亚洲综合激情小说| 丁香视频免费观看| 欧美人狂配大交3d怪物一区| 国产在线激情| xxx欧美精品| 国产高清一区| 免费黄色成人| 欧美肥臀大乳一区二区免费视频| 在线观看免费黄色| 亚洲午夜久久久| 一区二区三区免费播放| 99免费精品视频| 欧美精品七区| 日韩影院二区| 国产91色在线播放| 麻豆精品一区| 亚洲二区在线播放视频| 欧美理论在线观看| 亚洲国产欧美一区二区三区丁香婷| 欧美 另类 交| 色婷婷热久久| 国产精国产精品| 琪琪久久久久日韩精品| 色综合天天狠天天透天天伊人| 婷婷久久国产对白刺激五月99| 色妞久久福利网| 天天槽夜夜槽| 久久嫩草精品久久久久| 日韩精品 欧美| 国产色一区二区| 2020中文字幕在线| 亚洲五码中文字幕| 新的色悠悠久久久| 亚洲成av人片在www色猫咪| 午夜网站在线观看| 欧美性极品xxxx做受| 成人在线看视频| 成人国产精品视频| 欧美一级中文字幕| 麻豆91在线播放免费| 国产美女玉足交| 日韩精品福利网站| av毛片在线看| 精品污污网站免费看|