国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java Q&A: 使用Observer模式

2019-11-18 14:16:48
字體:
供稿:網(wǎng)友

java Q&A: 使用Observer模式

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

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

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

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

1. 弄清你的問題

2. 了解這個(gè)模式

3. 理解這個(gè)模式如何解決你的問題

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

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

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

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

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

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

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

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

看看下面的Java示例:

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

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

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

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

下面看看Subject的一個(gè)簡(jiǎn)單的實(shí)現(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;
      }



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永胜县| 宣汉县| 灵川县| 延寿县| 平舆县| 天台县| 中阳县| 南靖县| 孝义市| 阿拉善盟| 和田县| 辽源市| 大同市| 怀宁县| 萍乡市| 海伦市| 宁都县| 探索| 彰武县| 浪卡子县| 金堂县| 盐城市| 唐山市| 汕尾市| 临夏市| 射洪县| 体育| 肃南| 乌鲁木齐县| 策勒县| 浮山县| 镇坪县| 珠海市| 曲沃县| 甘孜| 莲花县| 沈丘县| 太白县| 平潭县| 台前县| 札达县|