欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

全面解析Java觀察者模式

 更新時間:2016年09月08日 11:54:00   作者:生命壹號  
這篇文章主要幫助大家全面解析Java觀察者模式,了解java設(shè)計模式中的觀察者模式,感興趣的小伙伴們可以參考一下

【正文】

一、觀察者模式的定義:

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

二、觀察者模式的實現(xiàn):

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

圖表描述如下:

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

三、舉例說明:

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

步驟如下:

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

package com.vince.observer;
public interface Observable {
 //注冊為一個觀察者 
 public void registerObserver(Observer observer);
 
 //取消觀察者 
 public void removeObserver(Observer observer);
 
 //通知所有觀察者更新信息 
 public void notifyObservers();
}

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

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() {
  //實現(xiàn)通知所有的觀察者對象
  for (Observer observer:vector) {
   observer.update(price);
  }
 }
}

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

package com.vince.observer;

public interface Observer {

  public void update(float price);5 

}

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

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+"關(guān)注的杯子的價格已更新為:"+price);
 }
}

(5)測試:

package com.vince.observer;
public class Test {
 public static void main(String[] args) {
  //創(chuàng)建一個被觀察者對象
  Cup doll = new Cup(3000);
  //創(chuàng)建兩個觀察者對象
  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);  
  
 }
}

運行后,顯示結(jié)果如下:

【方案二】:直接調(diào)用JDK的API去實現(xiàn)。

步驟如下:

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

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();//通知,數(shù)據(jù)已改變
  this.notifyObservers();
 }
 
 
}

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

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+"關(guān)注的杯子價格已更新為:"+cup.getPrice());
  }
 }
}

(3)測試:

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);
 }
}

運行后,結(jié)果如下:

【工程文件】

鏈接:http://xiazai.jb51.net/201609/yuanma/JavaSEguancha(jb51.net).rar

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java-lambda表達式入門看這一篇就夠了

    Java-lambda表達式入門看這一篇就夠了

    lambda表達式最簡單的作用就是用于簡化創(chuàng)建匿名內(nèi)部類對象,Lambda表達式是一個可傳遞的代碼塊,可以在以后執(zhí)行一次或多次,下面通過本文給大家介紹Java-lambda表達式入門教程,感興趣的朋友一起看看吧
    2021-05-05
  • Spring在代碼中獲取bean的幾種方式詳解

    Spring在代碼中獲取bean的幾種方式詳解

    這篇文章主要介紹了Spring在代碼中獲取bean的幾種方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 淺析Android系統(tǒng)中HTTPS通信的實現(xiàn)

    淺析Android系統(tǒng)中HTTPS通信的實現(xiàn)

    這篇文章主要介紹了淺析Android系統(tǒng)中HTTPS通信的實現(xiàn),實現(xiàn)握手的源碼為Java語言編寫,需要的朋友可以參考下
    2015-07-07
  • 淺析java移位符的具體使用

    淺析java移位符的具體使用

    這篇文章主要介紹了淺析java移位符的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • FastJson對于JSON格式字符串、JSON對象及JavaBean之間的相互轉(zhuǎn)換操作

    FastJson對于JSON格式字符串、JSON對象及JavaBean之間的相互轉(zhuǎn)換操作

    這篇文章主要介紹了FastJson對于JSON格式字符串、JSON對象及JavaBean之間的相互轉(zhuǎn)換,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • java中String與StringBuilder的區(qū)別

    java中String與StringBuilder的區(qū)別

    本篇文章介紹了,java中String與StringBuilder的區(qū)別。需要的朋友參考下
    2013-04-04
  • SpringBoot自定義錯誤處理邏輯詳解

    SpringBoot自定義錯誤處理邏輯詳解

    這篇文章主要介紹了SpringBoot自定義錯誤處理邏輯,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • 強烈推薦這些提升代碼效率的IDEA使用技巧

    強烈推薦這些提升代碼效率的IDEA使用技巧

    在平常的開發(fā)中,發(fā)現(xiàn)一些同事對Idea 使用的不是很熟練,僅僅用來編輯,編譯,不能很好的發(fā)揮Idea 的神奇.整理了下我平常用的一些技巧,希望你能從中學(xué)習(xí)到一些.需要的朋友可以參考下
    2021-05-05
  • Window搭建部署RocketMQ步驟詳解

    Window搭建部署RocketMQ步驟詳解

    這篇文章主要介紹了Window搭建部署RocketMQ步驟詳解,RocketMq是一個由阿里巴巴開源的消息中間件,脫胎去阿里每部使用的MetaQ,在設(shè)計上借鑒了Kafka。,需要的朋友可以參考下
    2019-06-06
  • 深入剖析Java ReentrantLock的源碼

    深入剖析Java ReentrantLock的源碼

    ReentrantLock和Synchronized都是Java開發(fā)中最常用的鎖,與Synchronized這種JVM內(nèi)置鎖不同的是,ReentrantLock提供了更豐富的語義。本文就來深入剖析一下ReentrantLock源碼,需要的可以參考一下
    2022-11-11

最新評論