標籤:java 觀察者模式
觀察者模式介紹:
觀察者模式(Observer)完美的將觀察者和被觀察的對象分離開。舉個例子,使用者介面可以作為一個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,探索資料變化後,就顯示在介面上。物件導向設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,並且將他做好。觀察者模式在模組之間劃定了清晰的界限,提高了應用程式的可維護性和重用性。
觀察者設計模式定義了對象間的一種一對多的依賴關係,以便一個對象的狀態發生變化時,所有依賴於它的對象都得到通知並自動重新整理。
觀察者模式實現方式:
觀察者模式有很多實現方式,從根本上說,該模式必須包含兩個角色:觀察者和被觀察對象。在剛才的例子中,業務資料是被觀察對象,使用者介面是觀察者。觀察者和被觀察者之間存在"觀察"的邏輯關聯,當被觀察者發生改變的時候,觀察者就會觀察到這樣的變化,並且做出相應的響應。如果在使用者介面、業務資料之間使用這樣的觀察過程,可以確保介面和資料之間劃清界限,假定應用程式的需求發生變化,需要修改介面的表現,只需要重新構建一個使用者介面,業務資料不需要發生變化。
類設計
增加,刪除,通知觀察者對象主題介面
《interface》 Subject
+addObserver() 增加(註冊)觀察者
+moveObserver() 刪除觀察者
+notifyObserver() 通知(所有)觀察者
2. 被觀察對象繼承觀察者對象主題介面(Subject)
ConcretSubject 繼承 Subject,實現 addObserver() 增加觀察者,moveObserver() 刪除觀察者,notifyObserver() 通知(所有)觀察者
3. 所有觀察者介面
《interface》 Observer
+update() 為被觀察者的資訊變化做出相應的回應
4. 實際的觀察者類
ConcretObserver 繼承 Observer 介面,實現 update()
觀察者執行個體:
public interface StudentSubject {public void addObserver(ParentObserver one);public void moveObserver(ParentObserver one);public void notifyObserver();}package SuperHakceToolSPackage;import java.util.ArrayList;public class Student implements StudentSubject{private float grades;private ArrayList <ParentObserver> parentObservers = new ArrayList<ParentObserver>();@Overridepublic void addObserver(ParentObserver one) {this.parentObservers.add(one);}@Overridepublic void moveObserver(ParentObserver one) {this.parentObservers.remove(one);}@Overridepublic void notifyObserver() {for(int i = 0;i < this.parentObservers.size();i ++){this.parentObservers.get(i).update(grades);}}public void setGrades(float grades){this.grades = grades;notifyObserver();}public float getGrades(){return this.grades;}public void gradesChange(){notifyObserver();}}package SuperHakceToolSPackage;public interface ParentObserver {public void update(float grades);}package SuperHakceToolSPackage;public class Parent implements ParentObserver{private float grades;public Parent(Student student){student.addObserver(this);}@Overridepublic void update(float grades) {this.grades = grades;print();}public void print(){System.out.println("I am Parent and your grades is " + this.grades);}}package SuperHakceToolSPackage;public class ParentTwo implements ParentObserver{private float grades;public ParentTwo(Student student){student.addObserver(this);}@Overridepublic void update(float grades) {this.grades = grades;print();}public void print(){System.out.println("I am ParentTwo and your grades is " + this.grades);}}
本文出自 “SuperHakce” 部落格,請務必保留此出處http://superhakce.blog.51cto.com/6671637/1899153
Java 設計模式之觀察者模式