面向物件設計模式之---觀察者模式(Observer Pattern)
今天更新的設計模式是觀察者模式。剛才稍微去看了一眼Web前端開發,很炫!很炫!
對於這個觀察者模式,我就直接開門見山地直接放出定義和UML類圖,後面再解釋。
觀察者模式的定義如下:
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽一個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。 ——《大話設計模式》
UML類圖如下:
首先看到的是一個叫Subject的抽象類,這個Subject類可以解釋為抽象的課題類,裡面有一個Attach和Detach抽象方法,這意味著一個課題可以有多個觀察者來觀察,可以加入,可以退出。
舉個例子吧,比如股票漲跌這個課題,每一支股票肯定有很多人關注,這些人就是這支股票的觀察者,假設有一天股票漲了,從某個層面上就通知了那些所有的觀察者說股票可以賣出了。我們不妨把這個例子轉變為程式碼:
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();
}
}
執行結果為:
顯然,觀察者模式的工作是在解除耦合,讓雙方都依賴抽象,而不是具體。