1. 程式人生 > >面向物件設計模式之---觀察者模式(Observer Pattern)

面向物件設計模式之---觀察者模式(Observer Pattern)

今天更新的設計模式是觀察者模式。剛才稍微去看了一眼Web前端開發,很炫!很炫!

對於這個觀察者模式,我就直接開門見山地直接放出定義和UML類圖,後面再解釋。

觀察者模式的定義如下:

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽一個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。 ——《大話設計模式》

UML類圖如下:

首先看到的是一個叫Subject的抽象類,這個Subject類可以解釋為抽象的課題類,裡面有一個Attach和Detach抽象方法,這意味著一個課題可以有多個觀察者來觀察,可以加入,可以退出。

然後有一個Notify通知方法,當這個課題的狀態發生變化的時候,逐一通知所有的觀察者。接下來就是抽象的Observer類,也就是觀察者類,裡面只有一個抽象的Update的方法,這個方法就是被Subject類所呼叫,在通知的時候觀察者做出響應的方法。再接下來就是繼承Subject的ConcentrateSubject類和繼承Observer的ConcentrateObserver類,ConcentrateSubject類的SubjectState屬性規定了課題的狀態,一旦這個狀態被改變,將會影響所有的觀察者。至於ConcrateObserver類中的observerState,規定了觀察者的狀態,受ConcentrateSubject具體課題的影響。一個具體的觀察者類只關注一個具體的課題。

舉個例子吧,比如股票漲跌這個課題,每一支股票肯定有很多人關注,這些人就是這支股票的觀察者,假設有一天股票漲了,從某個層面上就通知了那些所有的觀察者說股票可以賣出了。我們不妨把這個例子轉變為程式碼:

import java.util.*;

//抽象的課題
abstract class Subject
{
  //觀察者列表
  protected ArrayList<Observer> oblist = new ArrayList<Observer>();
  //新增觀察者
  public void Attach(Observer o)
  {
    oblist.add(o);
  }
  //移除觀察者
public void Detach(Observer o) { oblist.remove(o); } //通知觀察者 public void Notify() { for(int i = 0 ; i < oblist.size() ; i++) { oblist.get(i).Update(); } } } //抽象的觀察者 abstract class Observer { //對通知做出響應 public abstract void Update(); } //股票課題 class Stock extends Subject { //具體課題狀態 private String subjectState; public void setSubjectState(String state) { this.subjectState = state; } public String getSubjectState() { return this.subjectState; } } //具體的觀察者 具體的觀察者觀察一個具體課題 class Watcher extends Observer { private String observerState; //Subject用以更新observerState private Stock subject; private String name; public Watcher(String name , Stock sub) { this.name = name; this.subject = sub; } public void Update() { //觀察者的state與課題的state相關聯 this.observerState = subject.getSubjectState(); System.out.println(this.name+" notified! State is " + this.observerState); } } public class Main { public static void main(String args[]) { Stock s = new Stock(); s.Attach(new Watcher("股民A",s)); s.Attach(new Watcher("股民B",s)); s.setSubjectState("股票漲了!"); s.Notify(); } }

執行結果為:

顯然,觀察者模式的工作是在解除耦合,讓雙方都依賴抽象,而不是具體。