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

Java不雅察者設計形式詳解

編輯:關於JAVA

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


   不雅察者形式(有時又被稱為宣布(publish )-定閱(Subscribe)形式、模子-視圖(View)形式、源-收聽者(Listener)形式或附屬者形式)是軟件設計形式的一種。在此種形式中,一個目的物件治理一切相依於它的不雅察者物件,而且在它自己的狀況轉變時自動收回告訴。這平日透過呼喚各不雅察者所供給的辦法來完成。此種形式平日被用來完成事宜處置體系。

  不雅察者形式(Observer)完善的將不雅察者和被不雅察的對象分別開。舉個例子,用戶界面可以作為一個不雅察者,營業數據是被不雅察者,用戶界面不雅察營業數據的變更,發明數據變更後,就顯示在界面上。面向對象設計的一個准繩是:體系中的每一個類將重點放在某一個功效上,而不是其他方面。一個對象只做一件工作,而且將他做好。不雅察者形式在模塊之間規定了清楚的界線,進步了運用法式的可保護性和重用性。
不雅察者設計形式界說了對象間的一種一對多的依附關系,以便一個對象的狀況產生變更時,一切依附於它的對象都獲得告訴並主動刷新。
完成方法:
不雅察者形式有許多完成方法,從基本上說,該形式必需包括兩個腳色:不雅察者和被不雅察對象。在適才的例子中,營業數據是被不雅察對象,用戶界面是不雅察者。不雅察者和被不雅察者之間存在“不雅察”的邏輯聯系關系,當被不雅察者產生轉變的時刻,不雅察者就會不雅察到如許的變更,而且做出響應的呼應。假如在用戶界面、營業數據之間應用如許的不雅察進程,可以確保界面和數據之間劃清界線,假定運用法式的需求產生變更,須要修正界面的表示,只須要從新構建一個用戶界面,營業數據不須要產生變更。
1、不雅察者

(Observer)將本身注冊到被不雅察對象(Subject)中,被不雅察對象將不雅察者寄存在一個容器(Container)裡。

2、被不雅察

被不雅察對象產生了某種變更(如圖中的SomeChange),自在器中獲得一切注冊過的不雅察者,將變更告訴不雅察者。

3、撤消不雅察

不雅察者告知被不雅察者要撤消不雅察,被不雅察者自在器中將不雅察者去除。
不雅察者將本身注冊到被不雅察者的容器中時,被不雅察者不該該干預干與不雅察者的詳細類型,而是應當應用不雅察者的接口。如許的長處是:假定法式中還有其余不雅察者,那末只需這個不雅察者也是雷同的接話柄現便可。一個被不雅察者可以對應多個不雅察者,當被不雅察者產生變更的時刻,他可以將新聞逐個告訴給一切的不雅察者。基於接口,而不是詳細的完成——這一點為法式供給了更年夜的靈巧性。

示范代碼:
界說被不雅察的腳色籠統類:

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

被不雅察腳色子類:

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

界說不雅察者接口:

package test.edu.mainrole; 
 
public interface IObserver { 
  public void update(String newState); 
     
} 

詳細的不雅察者:

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

測試客戶端:

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的狀況為:update!

不雅察者2的狀況為:update!

以上就是本文的全體內容,願望對年夜家的進修有所啟示。

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