在线看毛片视频-国产免费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>
  • 日韩精品一区二区三区不卡 | 国产一区视频免费观看| 午夜探花在线观看| 亚洲午夜精品一区| 欧美成人福利在线观看| 欧美第一页浮力影院| 已婚少妇美妙人妻系列| 又色又爽又高潮免费视频国产| 国模无码视频一区二区三区| 亚洲中文字幕无码av永久| 日韩欧美精品免费| 国产精品无码av在线播放| 婷婷五月综合缴情在线视频| 国产特级黄色大片| 熟妇人妻无乱码中文字幕真矢织江| 国产精品欧美激情在线观看| 国产福利一区视频| 日本77777| 国产又大又长又粗又黄| 国产一二三区在线播放| 久久国产亚洲精品无码| 我看黄色一级片| 亚洲综合20p| 狠狠噜天天噜日日噜| 欧美 国产 日本| 91日韩视频在线观看| 欧美少妇一级片| 国产96在线 | 亚洲| 日本美女高潮视频| 国产 欧美 日本| 精品免费国产一区二区| 国产福利片一区二区| 成人综合视频在线| 亚洲综合伊人久久| 男人靠女人免费视频网站| 婷婷激情5月天| 人妻夜夜添夜夜无码av| 国产免费又粗又猛又爽| 又大又硬又爽免费视频| 91高清国产视频| 国产素人在线观看| 亚洲综合激情视频| 欧美日韩在线不卡视频| 亚洲一区 在线播放| 538在线视频观看| 极品粉嫩国产18尤物| 国产一区一区三区| 亚洲黄色小视频在线观看| 2018中文字幕第一页| 中文字幕超清在线免费观看| 丰满少妇在线观看| 男人日女人bb视频| 日韩a级黄色片| 在线免费黄色小视频| 国产黄色特级片| 男女猛烈激情xx00免费视频| 深夜做爰性大片蜜桃| 欧美性猛交xxx乱久交| 男人日女人bb视频| 日韩欧美亚洲天堂| 少妇人妻大乳在线视频| 成人在线国产视频| 国产一二三区在线播放| 欧美在线观看黄| 国产日韩欧美大片| av动漫在线播放| 久久久久久久久久伊人| 永久免费看av| 免费看欧美黑人毛片| 青青草精品视频在线| 国产又粗又猛又爽又黄的网站| 最新中文字幕久久| 992tv快乐视频| 久久久国内精品| 欧美图片激情小说| 人人妻人人添人人爽欧美一区| 黄色一级片国产| 777精品久无码人妻蜜桃| 欧美中文字幕在线观看视频| 成人在线播放网址| 毛片av免费在线观看| 亚洲 欧美 另类人妖| 奇米777在线视频| 男人日女人的bb| 国产熟女高潮视频| www.色就是色.com| 日韩中文在线字幕| 人妻有码中文字幕| 男人添女人下面免费视频| 麻豆中文字幕在线观看| 日韩精品一区二区免费| 日韩中文字幕免费在线| 免费不卡av网站| 国产欧美在线一区| 亚洲欧美日韩一二三区| 成年人午夜视频在线观看| 五月婷婷之综合激情| 六月婷婷激情网| 日本毛片在线免费观看| 国产在线视频三区| 91视频最新入口| 97精品国产97久久久久久粉红| 黄色大片中文字幕| 少妇熟女一区二区| 欧美 日韩 国产 高清| 国产精品嫩草影视| www.日日操| 人人妻人人做人人爽| 99热一区二区| 日韩av播放器| 青青草国产免费| 国产卡一卡二在线| 91 视频免费观看| 国产成人久久777777| 免费在线看黄色片| 青青草原网站在线观看| 自拍偷拍一区二区三区四区| www.av片| 黄页免费在线观看视频| 神马午夜伦理影院| 日本中文字幕精品—区二区| 久久精品一区二| 国产一区二区在线视频播放| 大片在线观看网站免费收看| 手机av在线网站| 加勒比av中文字幕| 中文字幕一区久久| 在线观看免费不卡av| 亚洲欧美自拍另类日韩| 欧美污视频网站| 日韩av资源在线| 日av中文字幕| 自拍偷拍 国产| 日韩av卡一卡二| 在线观看国产中文字幕| 日本人视频jizz页码69| 中文字幕第88页| 五月激情五月婷婷| 日本特级黄色大片| 国产91porn| 欧美在线一区视频| 超碰影院在线观看| 女人另类性混交zo| 五月婷婷六月丁香激情| 一级黄色在线播放| 9999在线观看| 成人黄色大片网站| 国产精品无码专区av在线播放| 国产一区二区视频免费在线观看| 成人性做爰aaa片免费看不忠| 免费看污污网站| 亚洲天堂av一区二区三区| 日韩精品手机在线观看| 99精品在线免费视频| 鲁一鲁一鲁一鲁一av| 日韩视频一二三| 国产精品97在线| 奇米影视四色在线| 成人免费在线视频播放| 精品久久久久久无码国产| 国内自拍第二页| 青青草国产精品视频| 老司机久久精品| 日本人体一区二区| 中文字幕精品一区二区三区在线| 波多野结衣与黑人| 国产福利影院在线观看| 天天做天天躁天天躁| 蜜臀久久99精品久久久酒店新书 | 国产v亚洲v天堂无码久久久| 亚洲精品免费一区亚洲精品免费精品一区 | 欧美性受xxxx黒人xyx性爽| 黄色一级片在线看| а 天堂 在线| 黑森林福利视频导航| 女人色极品影院| 午夜精品久久久久久久99热影院| 中文字幕无码精品亚洲资源网久久| www.久久久久久久久久久| 亚洲人成色77777| 成人免费在线网| 18视频在线观看娇喘| a在线观看免费视频| 熟女性饥渴一区二区三区| 日本男女交配视频| 中文字幕精品在线播放| 五月婷婷六月丁香激情| 免费在线观看的毛片| 欧美a在线视频| 日韩视频免费播放| 成人免费在线视频播放| 波多野结衣激情| 欧美亚洲视频一区| 男女污污视频网站| 一区二区三区欧美精品| 中文字幕av不卡在线| 在线观看国产一级片| 天堂av在线8| 在线视频观看一区二区| 亚洲在线观看网站|