激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - 全面解析Java觀察者模式

全面解析Java觀察者模式

2020-06-14 11:04生命壹號 JAVA教程

這篇文章主要幫助大家全面解析Java觀察者模式,了解java設計模式中的觀察者模式,感興趣的小伙伴們可以參考一下

【正文】

一、觀察者模式的定義:

簡單地說,觀察者模式定義了一個一對多的依賴關系,讓一個或多個觀察者對象監聽一個主題對象。這樣一來,當被觀察者狀態發生改變時,需要通知相應的觀察者,使這些觀察者對象能夠自動更新。例如:GUI中的事件處理機制采用的就是觀察者模式。

二、觀察者模式的實現:

Subject(被觀察的對象接口):規定ConcreteSubject的統一接口 ; 每個Subject可以有多個Observer;ConcreteSubject(具體被觀察對象):維護對所有具體觀察者的引用的列表 ;–狀態發生變化時會發送通知給所有注冊的觀察者。Observer(觀察者接口):規定ConcreteObserver的統一接口;定義了一個update()方法,在被觀察對象狀態改變時會被調用。ConcreteObserver(具體觀察者):維護一個對ConcreteSubject的引用;特定狀態與ConcreteSubject同步;實現Observer接口,update()方法的作用:一旦檢測到Subject有變動,就更新信息。

圖表描述如下:

全面解析Java觀察者模式

注:在被觀察者類中需要有一個集合維護所有觀察者。

三、舉例說明:

【方案一】:自己定義接口或者類來實現觀察者模式。

步驟如下:

(1)定義被觀察者所具有的接口:

?
1
2
3
4
5
6
7
8
9
10
11
package com.vince.observer;
public interface Observable {
 //注冊為一個觀察者
 public void registerObserver(Observer observer);
 
 //取消觀察者
 public void removeObserver(Observer observer);
 
 //通知所有觀察者更新信息
 public void notifyObservers();
}

(2)定義具體的被觀察者:杯子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.vince.observer;
import java.util.Vector;
 
public class Cup implements Observable{
 //被觀察者維護的一個觀察者對象列表
 private Vector<Observer> vector = new Vector<Observer>();
 private float price;
 
 public Cup(float price){
  this.price = price;
 }
 
 public float getPrice() {
  return price;
 }
 public void setPrice(float price) {
  //修改價格時,通知所有觀察者
  this.price = price;
  notifyObservers();
 }
 @Override
 public void registerObserver(Observer observer) {
  //注冊觀察者
  vector.add(observer);
 }
 @Override
 public void removeObserver(Observer observer) {
  //取消觀察者
  vector.remove(observer);
 }
 @Override
 public void notifyObservers() {
  //實現通知所有的觀察者對象
  for (Observer observer:vector) {
   observer.update(price);
  }
 }
}

(3)定義觀察者所具有的共同的接口:(更新數據最終當然是在觀察者那里進行啦)

?
1
2
3
4
5
6
7
package com.vince.observer;
 
public interface Observer {
 
  public void update(float price);5
 
}

(4)定義具體的觀察者對象:

?
1
2
3
4
5
6
7
8
9
10
11
package com.vince.observer;
public class Person implements Observer{
 private String name;
 public Person(String name){
  this.name = name;
 }
 @Override
 public void update(float price) {
  System.out.println(name+"關注的杯子的價格已更新為:"+price);
 }
}

(5)測試:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.vince.observer;
public class Test {
 public static void main(String[] args) {
  //創建一個被觀察者對象
  Cup doll = new Cup(3000);
  //創建兩個觀察者對象
  Person p1 = new Person("生命壹號");
  Person p2 = new Person("生命貳號");
  //注冊成為一個觀察者
  doll.registerObserver(p1);
  doll.registerObserver(p2);
  
  System.out.println("第一輪促銷:");
  doll.setPrice(2698);// 價格變動
  System.out.println("第二輪促銷:");
  doll.setPrice(2299);//
  System.out.println("第三輪促銷:");
  doll.setPrice(1998);
  
  doll.removeObserver(p2); //將生命二號移除
  System.out.println("第四輪促銷:");
  doll.setPrice(1098); 
  
 }
}

運行后,顯示結果如下:

全面解析Java觀察者模式

 

【方案二】:直接調用JDK的API去實現。

步驟如下:

(1) 通過繼承Observable類實現具體的被觀察者對象:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.vince.observer2;
import java.util.Observable;
 
public class Cup extends Observable{
 private float price;
 
 public Cup(float price){
  this.price = price;
 }
 public float getPrice() {
  return price;
 }
 public void setPrice(float price) {
  this.price = price;
  this.setChanged();//通知,數據已改變
  this.notifyObservers();
 }
 
 
}

(2)通過實現java.util.Observer接口實現具體的觀察者對象:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.vince.observer2;
import java.util.Observable;
import java.util.Observer;
 
public class Person implements Observer{
 private String name;
 public Person(String name){
  this.name = name;
 }
 @Override
 public void update(Observable o, Object arg) {
  if(o instanceof Cup){
   Cup cup = (Cup)o;
   System.out.println(name+"關注的杯子價格已更新為:"+cup.getPrice());
  }
 }
}

(3)測試:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.vince.observer2;
public class Test {
 public static void main(String[] args) {
  Cup cup = new Cup(3000);
  Person p1 = new Person("生命壹號");
  Person p2 = new Person("生命貳號");
  cup.addObserver(p1);
  cup.addObserver(p2);
  System.out.println("第一輪促銷");
  cup.setPrice(2988);
  System.out.println("第二輪促銷");
  cup.setPrice(2698);
  
  cup.deleteObserver(p2);
  System.out.println("第三輪促銷");
  cup.setPrice(1998);
 }
}

運行后,結果如下:

全面解析Java觀察者模式

【工程文件】

鏈接:JavaSEguancha.rar

四、總結:(觀察者模式的作用)

觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表。

由于被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬于不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那么這個對象必然跨越抽象化和具體化層次。

觀察者模式支持廣播通訊。被觀察者會向所有的登記過的觀察者發出通知。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/smyhvae/p/3899208.html

延伸 · 閱讀

精彩推薦
306
主站蜘蛛池模板: 国产自在自线午夜精品视频在 | 91精品国产乱码久久桃 | 午夜精品老牛av一区二区三区 | 亚洲国产精品一区二区久久 | 色婷婷综合久久久中文一区二区 | 日本中文一级片 | 成人午夜免费av | 中文字幕视频在线播放 | 极色品影院 | 国产精品免费麻豆入口 | 黄色片一区二区 | 日本不卡一区二区三区在线 | 亚洲国产超高清a毛毛片 | 久久精品视频国产 | 嫩呦国产一区二区三区av | 久久精品国产清自在天天线 | 激情久久精品 | 欧美日韩精品一区二区三区蜜桃 | 免费a级网站 | 成人短视频在线观看 | 亚洲精品在线观看网站 | 亚洲人成网站免费播放 | 二区三区偷拍浴室洗澡视频 | 亚洲福利在线观看视频 | 国产亚洲精品视频中文字幕 | 色视频一区二区 | 蜜桃91丨九色丨蝌蚪91桃色 | 中文字幕在线资源 | 欧美日韩国产成人在线观看 | 欧美成人激情在线 | 亚洲最新黄色网址 | 日韩电影视频 | 午夜精品一区二区三区免费 | 亚洲免费网站 | 久久久在线 | xxxxhdvideosex| 国产www免费 | 《97色伦在色在线播放》 | 国产妞干网 | 久久久久久久久成人 | 亚洲av毛片成人精品 |