在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

Java Q&A: 運用Observer模式(轉(zhuǎn))

Java Q&A: 運用Observer模式(轉(zhuǎn))

更新時間:2022-05-06 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

Java Q&A: 使用Observer模式

A:我想在自己的Java程序中使用Observer模式。基于此,能否提供某些示例代碼來演示如何去做?

Q:正如面向?qū)ο缶幊逃兄诖a復(fù)用一樣,設(shè)計模式可以促進設(shè)計復(fù)用。確實,設(shè)計模式可以讓你復(fù)用那些正確的、成熟的設(shè)計。但近來,批評設(shè)計模式的聲音越來越多。批評者指出,缺乏經(jīng)驗的開發(fā)者會很容易地掉進 "模式陷阱" 之中。

模式陷阱讓缺乏經(jīng)驗的開發(fā)者迷失了方向。因而,他們在處理問題時不是去尋找可能存在的最好方案,而把最終目標(biāo)集中在盡可能地實現(xiàn)更多的設(shè)計模式之上。在一些人看來,使用設(shè)計模式好象必然會帶來良好的設(shè)計。按照這個邏輯,只要大量使用設(shè)計模式,就必然為你產(chǎn)生一個優(yōu)秀的設(shè)計!然而現(xiàn)實中,這一觀點卻導(dǎo)致出許多毫無意義的設(shè)計--即使這個設(shè)計采用了多個設(shè)計模式。看來很遺憾,設(shè)計模式并不能保證良好的設(shè)計。

要想在設(shè)計中正確地運用一個設(shè)計模式,必須確保三個條件:

1. 弄清你的問題

2. 了解這個模式

3. 理解這個模式如何解決你的問題

首先,最重要的是條件1。如果不能完全地弄清你要解決的問題,何談運用模式?

還要知道條件2:必須完全了解你想運用的模式。不了解它怎么能運用它?更重要的是,連一個模式做什么都不知道,又如何想到去用它?

最后一點,如果你不能清楚地說出模式將怎樣解決你的問題(為什么這個模式合適),那還是放棄它。僅僅為了用模式本身而去用它,就會掉進模式陷阱之中。

我并不是在說提這個問題的讀者也一定會掉進模式陷阱。但從提問的表達上來看,它很容易誤導(dǎo)一些開發(fā)者去理解設(shè)計模式。我對這個提問的理解是,這位讀者應(yīng)該清楚自己需要解決的問題,也了解Observer模式,他/她只是不知道如何用Java來實現(xiàn)。

在給出一個Java示例之前,為了有助于其他讀者也能理解,先簡要介紹一下Observer模式。

簡單來說,Observer模式讓一個對象(觀察者,Observer)去監(jiān)視另一個對象(目標(biāo),Subject);它使得目標(biāo)和觀察者之間建立一種 "發(fā)布--訂閱"(publish-subscribe )的關(guān)系。通過Observer模式,觀察者可以向目標(biāo)登記,表明自己要從目標(biāo)接收事件。目標(biāo)需要向觀察者通知事件時,只是簡單地將事件發(fā)給每一個觀察者。

例如,有一個基于某種數(shù)據(jù)模型的電子表格。只要數(shù)據(jù)模型發(fā)生變化,電子表格就需要更新表格單元以及內(nèi)嵌的圖表。這個例子中,目標(biāo)是數(shù)據(jù)模型,觀察者是表格單元和圖表。當(dāng)觀察者接收到數(shù)據(jù)模型已經(jīng)變化的通知時,它們就更新自己。

Observer模式的好處是:它解除了觀察者和目標(biāo)之間的耦合關(guān)系。目標(biāo)不需要知道它的觀察者的任何信息。相反,目標(biāo)只是允許觀察者訂閱事件。當(dāng)目標(biāo)產(chǎn)生一個事件時,它簡單地將事件傳給每一個觀察者。

看看下面的Java示例:

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

上面的代碼中,Subject接口定義了兩個方法(method),每個Subject都必須實現(xiàn)它們,以使Observer可以在Subject中增加或刪除自身。

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

Observer接口(如上)列出了一個方法(method),每個Observer都必須實現(xiàn)它,以使Subject可以發(fā)送更新消息給Observer。

下面看看Subject的一個簡單的實現(xiàn)--IntegerDataBag:

import java.util.ArrayList;
import java.util.Iterator;

public class IntegerDataBag implements Subject {

private ArrayList list = new ArrayList();
private ArrayList observers = new ArrayList();

public void add( Integer i ) {
list.add( i );
notifyObservers();
}

public Iterator iterator() {
return list.iterator();
}

public Integer remove( int index ) {
if( index < list.size() ) {
Integer i = (Integer) list.remove( index );
notifyObservers();
return i;
}
return null;
}

public void addObserver( Observer o ) {
observers.add( o );
}

public void removeObserver( Observer o ) {
observers.remove( o );
}

private void notifyObservers() {
// loop through and notify each observer
Iterator i = observers.iterator();
while( i.hasNext() ) {
Observer o = ( Observer ) i.next();
o.update( this );
}
}
}

IntegerDataBag適用于使用Integer的場合。IntegerDataBag也允許Observer增加和刪除它們自身。

再看看兩個Observer的實現(xiàn)--IntegerAdder和IntegerPrinter:

import java.util.Iterator;

public class IntegerAdder implements Observer {

private IntegerDataBag bag;

public IntegerAdder( IntegerDataBag bag ) {
this.bag = bag; 
bag.addObserver( this );
}

public void update( Subject o ) {
if( o == bag ) {
System.out.println( "The contents of the IntegerDataBag have changed." );
int counter = 0;
Iterator i = bag.iterator();
while( i.hasNext() ) {
Integer integer = ( Integer ) i.next();
counter+=integer.intValue();
}
System.out.println( "The new sum of the integers is: " + counter );
}
}

}

import java.util.Iterator;

public class IntegerPrinter implements Observer {

private IntegerDataBag bag;

public IntegerPrinter( IntegerDataBag bag ) {
this.bag = bag; 
bag.addObserver( this );
}

public void update( Subject o ) {
if( o == bag ) {
System.out.println( "The contents of the IntegerDataBag have changed." );
System.out.println( "The new contents of the IntegerDataBag contains:" );
Iterator i = bag.iterator();
while( i.hasNext() ) {
System.out.println( i.next() );
}
}
}

}

IntegerAdder和IntegerPrinter將自己作為觀察者增加到IntegerDataBag。當(dāng)IntegerAdder接收到一條更新消息時,它先統(tǒng)計bag中的總數(shù),然后顯示結(jié)果。同樣,當(dāng)IntegerPrinter接收到一條更新消息時,它打印出bag中的Interger。

下面是一個簡單的main(),它使用了上面的幾個類:

public class Driver {
public static void main( String [] args ) {
Integer i1 = new Integer( 1 ); Integer i2 = new Integer( 2 );
Integer i3 = new Integer( 3 ); Integer i4 = new Integer( 4 );
Integer i5 = new Integer( 5 ); Integer i6 = new Integer( 6 );
Integer i7 = new Integer( 7 ); Integer i8 = new Integer( 8 );
Integer i9 = new Integer( 9 );

IntegerDataBag bag = new IntegerDataBag();
bag.add( i1 ); bag.add( i2 ); bag.add( i3 ); bag.add( i4 );
bag.add( i5 ); bag.add( i6 ); bag.add( i7 ); bag.add( i8 );

IntegerAdder adder = new IntegerAdder( bag );
IntegerPrinter printer = new IntegerPrinter( bag );

// adder and printer add themselves to the bag

System.out.println( "About to add another integer to the bag:" );
bag.add( i9 );
System.out.println("");
System.out.println("About to remove an integer from the bag:");
bag.remove( 0 );
}
}

運行main,你將看到:

c:\javaworld\java Driver
About to add another integer to the bag:
The contents of the IntegerDataBag have changed.
The new sum of the intergers is: 45
The contents of the IntegerDataBag have changed.
The new contents of the IntegerDataBag contains:
1
2
3
4
5
6
7
8
9

About to remove an integer from the bag:
The contents of the IntegerDataBag have changed.
The new sum of the intergers is: 44
The contents of the IntegerDataBag have changed.
The new contents of the IntegerDataBag contains:
2
3
4
5
6
7
8
9

IntegerDataBag/IntegerAdder/IntegerPrinter是應(yīng)用Observer模式的一個很簡單的例子。Java本身有大量使用Observer模式的例子:AWT/Swing事件模型,還有java.util.Observer和java.util.Observable接口等,都是很好的例子。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 污污网站在线观看视频| 日韩精品在线中文字幕| 麻豆视频传媒入口| 黄色www网站| 今天免费高清在线观看国语| 免费男同深夜夜行网站| 成人在线视频一区二区三区 | 国语对白做受xxxxx在线中国| 在线免费看污网站| 麻豆传传媒久久久爱| 日韩av高清在线看片| www.黄色网址.com| 亚洲综合123| 伊人色在线观看| 午夜免费一区二区| 日日摸天天爽天天爽视频| 真实国产乱子伦对白视频| 永久av免费在线观看| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| av片在线免费| 一卡二卡三卡视频| 欧美a级黄色大片| 91麻豆天美传媒在线| 中文字幕一区二区三区四区五区人| 国产精品拍拍拍| 日本在线一二三区| 深夜黄色小视频| 天天摸天天舔天天操| 污污动漫在线观看| 中文字幕一区二区在线观看视频| 亚洲一区日韩精品| 国产无遮挡猛进猛出免费软件| 在线黄色免费观看| 日本一二区免费| 日韩精品第1页| 久艹在线免费观看| 久久视频免费在线| 女人高潮一级片| 污片在线免费看| 免费在线观看污污视频| 国产精品videossex国产高清| 日韩在线观看a| 免费在线观看日韩视频| 一本色道久久亚洲综合精品蜜桃| www.亚洲自拍| 成人免费性视频| 丝袜制服一区二区三区| 日韩 欧美 自拍| 久久久一本二本三本| 一道本在线免费视频| 日本a级片在线播放| 黑鬼大战白妞高潮喷白浆| 五月天视频在线观看| 国产一级做a爰片久久毛片男| 日本一区二区黄色| 日韩av加勒比| av免费在线播放网站| 免费成人进口网站| www.亚洲天堂网| 婷婷视频在线播放| 女人和拘做爰正片视频| 国产福利片一区二区| 日韩小视频在线播放| 永久免费黄色片| 91看片就是不一样| 日日噜噜夜夜狠狠久久丁香五月| 国产精品-区区久久久狼| 樱花草www在线| 午夜dv内射一区二区| 欧洲精品在线播放| 在线观看av免费观看| 男人天堂999| 中国女人做爰视频| 国产喷水theporn| 啊啊啊一区二区| 六月婷婷激情综合| 91插插插影院| 欧美男女交配视频| 又色又爽又高潮免费视频国产| 国产911在线观看| 欧美一级xxxx| 亚洲欧美视频二区| 91视频最新入口| 国产免费观看高清视频| 免费在线黄网站| 免费网站在线观看视频| 韩国一区二区在线播放| 性生生活大片免费看视频| 波多野结衣作品集| 久久美女福利视频| 日本免费不卡一区二区| 无码精品a∨在线观看中文| av片在线免费| 妞干网在线观看视频| 欧美做暖暖视频| 中文字幕の友人北条麻妃| 日韩欧美色视频| avove在线观看| 少妇久久久久久被弄到高潮| 韩国黄色一级大片| 男人天堂新网址| 黄色一级片在线看| 欧美日韩亚洲一| chinese少妇国语对白| 色多多视频在线播放| 99视频在线视频| 中文字幕亚洲影院| 欧美一级黄色录像片| 成人免费观看在线| 各处沟厕大尺度偷拍女厕嘘嘘| 日日碰狠狠躁久久躁婷婷| 黄色aaa级片| 日本在线视频www色| 日韩av新片网| 99视频精品免费| 久久久精品视频国产| 欧美视频在线观看视频| 国产淫片av片久久久久久| 天天干天天干天天干天天干天天干| 性刺激的欧美三级视频| 国产探花在线观看视频| 成年女人18级毛片毛片免费| 波多野结衣家庭教师在线| 亚洲男人天堂色| 乱熟女高潮一区二区在线| 欧美污视频网站| 公共露出暴露狂另类av| 干日本少妇首页| 天天干天天色天天爽| 欧美日韩国产精品激情在线播放| 小泽玛利亚视频在线观看| 国产va亚洲va在线va| 亚洲免费999| 337p粉嫩大胆噜噜噜鲁| 一区二区三区四区久久| 男女av免费观看| 免费观看亚洲视频| 小明看看成人免费视频| 欧美 日本 亚洲| 糖心vlog在线免费观看| 手机在线成人免费视频| 男女超爽视频免费播放| 9l视频自拍9l视频自拍| 色七七在线观看| 青青草成人免费在线视频| 色乱码一区二区三区熟女| 国产精品97在线| 久久视频这里有精品| 三级在线免费观看| 中文字幕丰满乱码| 欧美 国产 小说 另类| 一本久道高清无码视频| 男插女免费视频| 成年人免费观看的视频| 中文字幕22页| 国产av人人夜夜澡人人爽| 久久久久久久午夜| 香港三级日本三级a视频| 天堂v在线视频| 亚洲综合婷婷久久| 精品久久久久久久无码| 免费无码av片在线观看| 国产91在线免费| 青青草视频在线免费播放| 免费在线看黄色片| 一本大道东京热无码aⅴ| 操bbb操bbb| 日本大片免费看| www.夜夜爱| 国产网站免费在线观看| 人妻熟女一二三区夜夜爱| 播放灌醉水嫩大学生国内精品| 97视频久久久| 色诱视频在线观看| 亚洲一区二区三区四区五区xx| 特级丰满少妇一级| 免费看污污网站| 国产三级三级看三级| xxx国产在线观看| 欧美又黄又嫩大片a级| 国产成年人在线观看| 屁屁影院ccyy国产第一页| 精品无码国产一区二区三区av| 乱人伦xxxx国语对白| 黄色免费网址大全| 777一区二区| 国产精品69久久久| 成人精品小视频| 911av视频| 夜夜添无码一区二区三区| 亚洲人成色77777| 久久精品一卡二卡| 欧美视频免费看欧美视频| 91视频免费版污| 男人的天堂视频在线| 国产三区在线视频| 五月天色婷婷综合| 国产特级黄色大片| 视频免费1区二区三区| 成年人网站国产|