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

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

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!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91网红福利精品区一区二 | 欧美一区二区三区在线观看免费 | 久久久久久久久人体 | 久久99re热在线播放7 | 爽好大快深点一视频 | 性色AV乱码一区二区三区视频 | а天堂中文最新版在线 | 久久久久久久国产精品视频 | 国色天香 社区视频 | www视频免费| 99rv精品视频在线播放 | 男人j放进女人的p免费看视频 | 91精品国产亚洲爽啪在线影院 | 国产精品露脸国语对白河北 | jizz农村野外jizz农民 | 国产精品视频二区不卡 | 青青草视频国产 | 日韩精品中文字幕视频一区 | 99热精品在线播放 | 日韩在线视频一区二区三区 | 4虎影院永久地址www | 久草在线福利视频在线播放 | 男女真实无遮挡xx00动态图软件 | 精品久久99麻豆蜜桃666 | 国产麻豆在线观看网站 | 欧美性4khd720| 国产欧美二区三区 | 亚洲社区在线 | 扒开腿开嫩苞 | 成人精品第一区二区三区 | 99久久精品免费看国产情侣 | xxy中国厕所| 精品亚洲视频在线 | 香蕉免费一区二区三区在线观看 | h肉动漫在线视频无修无遮挡 | 小早川怜子亚洲综合中文字幕 | 婷婷网址 | 婷婷国产在线 | 国内精品久久久久久野外 | 免费看麻豆视频 | 美国复古性经典xxxxx |