一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java觀察者設計模式詳解

Java觀察者設計模式詳解

2020-03-27 19:16wangxin0314 JAVA教程

這篇文章主要為大家詳細介紹了Java觀察者設計模式,對觀察者設計模式進行分析理解,感興趣的小伙伴們可以參考一下

   觀察者模式(有時又被稱為發布(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟件設計模式的一種。在此種模式中,一個目標物件管理所有相依于它的觀察者物件,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。

  觀察者模式(Observer)完美的將觀察者和被觀察的對象分離開。舉個例子,用戶界面可以作為一個觀察者,業務數據是被觀察者,用戶界面觀察業務數據的變化,發現數據變化后,就顯示在界面上。面向對象設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,并且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。
觀察者設計模式定義了對象間的一種一對多的依賴關系,以便一個對象的狀態發生變化時,所有依賴于它的對象都得到通知并自動刷新。
實現方式:
觀察者模式有很多實現方式,從根本上說,該模式必須包含兩個角色:觀察者和被觀察對象。在剛才的例子中,業務數據是被觀察對象,用戶界面是觀察者。觀察者和被觀察者之間存在“觀察”的邏輯關聯,當被觀察者發生改變的時候,觀察者就會觀察到這樣的變化,并且做出相應的響應。如果在用戶界面、業務數據之間使用這樣的觀察過程,可以確保界面和數據之間劃清界限,假定應用程序的需求發生變化,需要修改界面的表現,只需要重新構建一個用戶界面,業務數據不需要發生變化。
1、觀察者

(Observer)將自己注冊到被觀察對象(Subject)中,被觀察對象將觀察者存放在一個容器(Container)里。

2、被觀察

被觀察對象發生了某種變化(如圖中的SomeChange),從容器中得到所有注冊過的觀察者,將變化通知觀察者。

3、撤銷觀察

觀察者告訴被觀察者要撤銷觀察,被觀察者從容器中將觀察者去除。
觀察者將自己注冊到被觀察者的容器中時,被觀察者不應該過問觀察者的具體類型,而是應該使用觀察者的接口。這樣的優點是:假定程序中還有別的觀察者,那么只要這個觀察者也是相同的接口實現即可。一個被觀察者可以對應多個觀察者,當被觀察者發生變化的時候,他可以將消息一一通知給所有的觀察者。基于接口,而不是具體的實現——這一點為程序提供了更大的靈活性。

示范代碼:
定義被觀察的角色抽象類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package test.edu.mainrole;
 
import java.util.ArrayList;
 
public abstract class AbsRole {
 
  private ArrayList<IObserver> list = new ArrayList<IObserver>();
 
  public void add(IObserver observer) {
    list.add(observer);
 
  }
 
  public void delete(IObserver observer) {
    list.remove(observer);
  }
 
  public void nodifyObservers(String newState) {
    for (IObserver observer : list) {
      observer.update(newState);
    }
  }
}

被觀察角色子類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test.edu.mainrole;
 
public class Role extends AbsRole {
 
  private String state;
 
  public String getState() {
    return state;
  }
 
  public void change(String nupdate) {
    state = nupdate;
    this.nodifyObservers(state);
  }
}

定義觀察者接口:

?
1
2
3
4
5
6
package test.edu.mainrole;
 
public interface IObserver {
  public void update(String newState);
     
}

具體的觀察者:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
package test.edu.mainrole;
 
public class ObserverObj1 implements IObserver{
 
  private String observerState;
 
  @Override
  public void update(String state) {
    observerState = state;
    System.out.println("觀察者1的狀態為:" + observerState);
  }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
package test.edu.mainrole;
 
public class ObserverObj2 implements IObserver {
   
  private String observerState;
 
  @Override
  public void update(String state) {
    observerState = state;
    System.out.println("觀察者2的狀態為:" + observerState);
  }
}

測試客戶端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package test.edu.mainrole;
 
public class Client {
 
  /**
   * @param args
   */
  public static void main(String[] args) {
 
    Role subject = new Role();
    IObserver observer1 = new ObserverObj1();
    IObserver observer2 = new ObserverObj2();
    subject.add(observer1);
    subject.add(observer2);
    subject.change("update!");
  }
}

運行結果:

?
1
2
3
觀察者1的狀態為:update!
 
觀察者2的狀態為:update!

以上就是本文的全部內容,希望對大家的學習有所啟發。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久久综合 | 99在线观看视频免费精品9 | 午夜福利在线观看6080 | 91肥熟国产老肥熟在线 | 欧美精品一区二区在线观看播放 | 四虎永久在线精品国产 | 精品国产一区二区三区久久久狼 | 麻生希在线 | 出差上的少妇20p | 色综合合久久天天综合绕视看 | 毛毛片在线 | 丰满岳乱妇在线观看视频国产 | 91视频免费网站 | 亚洲精品中文字幕久久久久久 | 欧美撒尿屁股嘘嘘撒尿 | 色在线看 | 国产精品思瑞在线观看 | 牛牛影院成人免费网页 | 色综合色狠狠天天综合色hd | 九九九九九九伊人 | 国产福利视频一区二区微拍视频 | 爱欲荡漾在线观看 | 黑人性xxxⅹxxbbbbb | 国产欧美日韩亚洲精品区2345 | 人人爽人人香蕉 | 精品一区二区三区高清免费不卡 | 希岛爱理aⅴ在线中文字幕 午夜综合网 | 欧美综合另类 | 日本高清在线播放一区二区三区 | 国产91精品在线播放 | 欧美高清3dfreexxxx性 | 日本老妇和子乱视频 | 亚洲色大成网站www久久九九 | 国产拍拍拍免费专区在线观看 | 日韩在线 在线播放 | 亚洲va韩国va欧美va天堂 | 狠狠色综合久久久久尤物 | 黑人巨大爆粗亚裔女人 | 欧洲女同同性videos0 | 日本高清有码视频 | 白丝萝莉喷水 |