程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 周全解析Java不雅察者形式

周全解析Java不雅察者形式

編輯:關於JAVA

周全解析Java不雅察者形式。本站提示廣大學習愛好者:(周全解析Java不雅察者形式)文章只能為提供參考,不一定能成為您想要的結果。以下是周全解析Java不雅察者形式正文


【注釋】

1、不雅察者形式的界說:

簡略地說,不雅察者形式界說了一個一對多的依附關系,讓一個或多個不雅察者對象監聽一個主題對象。如許一來,當被不雅察者狀況產生轉變時,須要告訴響應的不雅察者,使這些不雅察者對象可以或許主動更新。例如:GUI中的事宜處置機制采取的就是不雅察者形式。

2、不雅察者形式的完成:

Subject(被不雅察的對象接口):劃定ConcreteSubject的同一接口 ; 每一個Subject可以有多個Observer;ConcreteSubject(詳細被不雅察對象):保護對一切詳細不雅察者的援用的列表 ;–狀況產生變更時會發送告訴給一切注冊的不雅察者。Observer(不雅察者接口):劃定ConcreteObserver的同一接口;界說了一個update()辦法,在被不雅察對象狀況轉變時會被挪用。ConcreteObserver(詳細不雅察者):保護一個對ConcreteSubject的援用;特定狀況與ConcreteSubject同步;完成Observer接口,update()辦法的感化:一旦檢測到Subject有更改,就更新信息。

圖表描寫以下:

注:在被不雅察者類中須要有一個聚集保護一切不雅察者。

3、舉例解釋:

【計劃一】:本身界說接口或許類來完成不雅察者形式。

步調以下:

(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() {
  //完成告訴一切的不雅察者對象
  for (Observer observer:vector) {
   observer.update(price);
  }
 }
}

(3)界說不雅察者所具有的配合的接口:(更新數據終究固然是在不雅察者那邊停止啦)

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+"存眷的杯子的價錢已更新為:"+price);
 }
}

(5)測試:

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

運轉後,顯示成果以下:

【計劃二】:直接挪用JDK的API去完成。

步調以下:

(1) 經由過程繼續Observable類完成詳細的被不雅察者對象:

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接話柄現詳細的不雅察者對象:

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)測試:

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

運轉後,成果以下:

【工程文件】

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

4、總結:(不雅察者形式的感化)

不雅察者形式在被不雅察者和不雅察者之間樹立一個籠統的耦合。被不雅察者腳色所曉得的只是一個詳細不雅察者列表。

因為被不雅察者和不雅察者沒有慎密地耦合在一路,是以它們可以屬於分歧的籠統化條理。假如被不雅察者和不雅察者都被扔到一路,那末這個對象必定逾越籠統化和詳細化條理。

不雅察者形式支撐播送通信。被不雅察者會向一切的掛號過的不雅察者收回告訴。

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved