国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發(fā)教程 > 詳細頁面

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

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

更新時間:2022-05-06 文章作者:未知 信息來源:網絡 閱讀次數:

Java Q&A: 使用Observer模式

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

Q:正如面向對象編程有助于代碼復用一樣,設計模式可以促進設計復用。確實,設計模式可以讓你復用那些正確的、成熟的設計。但近來,批評設計模式的聲音越來越多。批評者指出,缺乏經驗的開發(fā)者會很容易地掉進 "模式陷阱" 之中。

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

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

1. 弄清你的問題

2. 了解這個模式

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

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

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

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

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

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

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

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

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

看看下面的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。當IntegerAdder接收到一條更新消息時,它先統(tǒng)計bag中的總數,然后顯示結果。同樣,當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是應用Observer模式的一個很簡單的例子。Java本身有大量使用Observer模式的例子:AWT/Swing事件模型,還有java.util.Observer和java.util.Observable接口等,都是很好的例子。

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

本類教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        在线播放国产精品二区一二区四区 | 337p亚洲精品色噜噜| 国产精品乱码一区二三区小蝌蚪| 美女脱光内衣内裤视频久久网站| 欧美性大战久久久| 免费在线一区观看| 久久精品视频一区二区| av亚洲产国偷v产偷v自拍| 亚洲色欲色欲www| 欧美性大战久久久久久久蜜臀| 亚洲www啪成人一区二区麻豆| 91麻豆精品国产91久久久久久| 免费高清在线一区| 亚洲国产精品成人久久综合一区| 91在线小视频| 天天免费综合色| 国产欧美综合在线观看第十页| 色又黄又爽网站www久久| 午夜激情一区二区| 久久精品免费在线观看| 在线亚洲人成电影网站色www| 日韩成人精品在线| 国产精品女主播av| 91精品福利在线一区二区三区 | 国产一区在线观看视频| 亚洲色欲色欲www| 欧美不卡123| 91久久人澡人人添人人爽欧美 | 欧美性大战xxxxx久久久| 麻豆精品视频在线| 亚洲人成网站色在线观看| 日韩欧美123| 在线观看亚洲一区| 风间由美性色一区二区三区| 秋霞影院一区二区| 一区二区三区在线视频观看58| 久久久久久97三级| 69久久夜色精品国产69蝌蚪网| 99re这里都是精品| 成人精品免费网站| 狠狠v欧美v日韩v亚洲ⅴ| 一区二区三区久久| 中文字幕二三区不卡| 欧美va亚洲va香蕉在线| 欧美福利视频导航| 欧美日韩五月天| 欧美午夜不卡在线观看免费| 白白色亚洲国产精品| 国内精品嫩模私拍在线| 日韩黄色小视频| 视频一区视频二区中文字幕| 中文字幕一区二区三区四区| 337p日本欧洲亚洲大胆精品 | 337p亚洲精品色噜噜噜| 欧美在线观看视频一区二区三区| 成人亚洲精品久久久久软件| 精品影视av免费| 日韩av一级电影| 视频一区视频二区中文| 亚洲v中文字幕| 亚洲国产精品欧美一二99| 亚洲欧美一区二区久久| 亚洲精品精品亚洲| 亚洲一区二区视频在线| 一区二区三区精品视频在线| 亚洲精品视频观看| 亚洲一二三四在线观看| 亚洲国产日韩一级| 日韩主播视频在线| 免费欧美在线视频| 久久成人av少妇免费| 久久机这里只有精品| 国产伦精品一区二区三区免费| 国内成人自拍视频| 国产福利视频一区二区三区| 丁香亚洲综合激情啪啪综合| 成人av电影在线| 色综合天天综合狠狠| 欧美日韩国产片| 欧美一二三区精品| 久久久久久综合| 综合av第一页| 午夜精品一区二区三区免费视频 | 国产美女主播视频一区| 成人免费视频国产在线观看| 一本大道久久a久久精品综合| 欧美揉bbbbb揉bbbbb| 欧美精品一区二区久久婷婷| 中文字幕国产一区二区| 亚洲www啪成人一区二区麻豆| 蜜乳av一区二区| 91视频91自| 日韩欧美不卡在线观看视频| 1区2区3区欧美| 久99久精品视频免费观看| 99热精品一区二区| 日韩一区二区免费电影| 成人欧美一区二区三区白人 | 一区二区久久久久| 精品一区二区av| 91久久一区二区| www精品美女久久久tv| 亚洲天堂中文字幕| 国产精一区二区三区| 欧美在线高清视频| 欧美国产精品一区二区| 三级成人在线视频| 99久久伊人网影院| 精品国产污网站| 亚洲成人av免费| 99久久久久久99| 国产欧美日韩激情| 麻豆精品视频在线观看免费| 欧美在线免费视屏| 综合精品久久久| 国产ts人妖一区二区| 欧美一级免费大片| 亚洲午夜激情av| 91老师国产黑色丝袜在线| 久久久精品蜜桃| 蜜桃av一区二区在线观看| 欧美日韩另类一区| 一区二区三区四区在线免费观看| 粉嫩一区二区三区性色av| 日韩欧美一区二区久久婷婷| 亚洲成人黄色小说| 91久久香蕉国产日韩欧美9色| 中文字幕+乱码+中文字幕一区| 久久99久久久久久久久久久| 51精品久久久久久久蜜臀| 亚洲尤物视频在线| 91久久久免费一区二区| 亚洲九九爱视频| 欧美在线观看你懂的| 亚洲永久精品国产| 欧美色视频一区| 午夜电影一区二区三区| 欧美日韩mp4| 日本亚洲免费观看| 日韩亚洲国产中文字幕欧美| 日本不卡1234视频| 精品久久久久久久人人人人传媒 | 亚洲激情校园春色| 99精品国产一区二区三区不卡| 国产精品久久777777| 国产91丝袜在线播放0| 国产精品少妇自拍| www.性欧美| 一区二区三区免费观看| 欧美日韩亚洲综合| 青青草原综合久久大伊人精品优势| 91麻豆精品国产91久久久更新时间| 日韩国产在线观看| 日韩一区二区免费电影| 激情另类小说区图片区视频区| 久久综合久久综合九色| 国产69精品久久久久777| 亚洲欧美日韩电影| 欧美人动与zoxxxx乱| 国产一区二区三区香蕉| 日本一区二区三区国色天香| 91丝袜高跟美女视频| 亚洲国产精品天堂| 精品久久免费看| 91麻豆高清视频| 乱一区二区av| 亚洲女同一区二区| 欧美一级片在线看| 成人精品国产免费网站| 香蕉影视欧美成人| 中文字幕久久午夜不卡| 欧美精品在欧美一区二区少妇| 国产一区二区在线看| 亚洲伊人伊色伊影伊综合网| 久久色在线视频| 色综合 综合色| 国产成人精品亚洲日本在线桃色 | 亚洲午夜久久久久久久久久久| 91精品国产综合久久国产大片| 国产成人午夜精品5599| 天使萌一区二区三区免费观看| 久久久久久久国产精品影院| 欧美日韩免费高清一区色橹橹| 国产激情一区二区三区桃花岛亚洲| 亚洲精品国产成人久久av盗摄| 欧美zozo另类异族| 欧美日韩中文字幕一区| 福利一区在线观看| 美女免费视频一区二区| 一区二区三区久久久| 91精品国产福利在线观看| 亚洲一区在线观看免费| 99免费精品在线| 91成人看片片| 色先锋久久av资源部| 国产亚洲精品福利| 69久久夜色精品国产69蝌蚪网| 成人av网站大全| 国产乱码精品1区2区3区| 日韩和欧美的一区|