一:Observer模式的類圖:java
二:說明:
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象能夠同時監聽某個主題對象,當這個對象在狀態上發生變化時,這個主題對象會通知全部的觀察者對象,讓他們可以自動地更新本身.
理解:
1.觀察者模式定義了一種一對多的依賴關係;指的是主題對象中有一個集合屬性,這個集合屬性能夠用來保存其對象的觀察者對象;如JDK對觀察者模式中的代碼實例:
/**主題對象中的一個集合屬性,用來保存中未來要通知的觀察者對象**/
private Vector obs;
/**爲主題對象增長一個觀察者的方法**/
public synchronized void addObserver(Observer o)
{
if (o == null)
{
throw new NullPointerException();
}
if (!obs.contains(o))
{
obs.addElement(o);
}
}
/**爲主題對象移除一個觀察者的方法**/
public synchronized void deleteObserver(Observer o)
{
obs.removeElement(o);
}
2.這個對象在狀態上發生變化:指的是主題對象有一個屬性,來專門表示自身的狀態是否有發生變化.以下代碼:
/** 標識主題對象狀態是否改變的字段 **/
private boolean changed = false;
/** 設定主題對象狀態改變的方法,咱們能夠Override這個方法來加入與本身業務相關的邏輯; **/
protected synchronized void setChanged()
{
changed = true;
}
/** 重置狀態改變的方法 **/
protected synchronized void clearChanged()
{
changed = false;
}
/** 返回狀態的更改; **/
public synchronized boolean hasChanged()
{
return changed;
}
3.這個主題對象會通知全部的觀察者對象,讓他們可以自動地更新本身. 表示在主題對象中,它會一個方法去循環調用每一個觀察者對象怎麼的update方法;以下:
/**不須要返回主題對象**/
public void notifyObservers()
{
notifyObservers(null);
}
/**返回主題對象的信息**/
public void notifyObservers(Object arg)
{
Object[] arrLocal;
synchronized (this)
{
if (!changed)
{
return;
}
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
{
((Observer)arrLocal[i]).update(this, arg);
}
}
三:實例說明
場景:
在學校裏,當中午放學的鈴聲一響時,老師會回辦公室,食堂準備開飯,有些學生準備回家;
Mapping:
鬧鈴--被觀察者對象(主題對象)
老師,學生,食堂 -- 觀察者對象.
用Java程序來實現這個場景;只需要主題對象繼承抽象Observable這個類, 老師,學生,食堂繼承Observer這個類,再實現與業務相關的方法就能夠了;
/**
* 觀察者模式中的具體主題角色
*/
package com.skywares.designpattern.observer;
import java.util.Observable;
/**
* @author Administrator
*
*/
public class Alarm extends Observable
{
public void signalEnd()
{
System.out.println("end .....");
/** 設置狀態改變 **/
this.setChanged();
/** 通知觀察者 **/
this.notifyObservers();
}
}
/**
* 觀察者模式中的具體觀察者角色
*/
package com.skywares.designpattern.observer;
import java.util.Observable;
import java.util.Observer;
public class Canteen implements Observer
{
@Override
public void update(Observable o, Object arg)
{
System.out.println(" ready to meat... ");
}
}
/**
* 觀察者模式中的具體觀察者角色
*/
package com.skywares.designpattern.observer;
import java.util.Observable;
import java.util.Observer;
public class Student implements Observer
{
@Override
public void update(Observable o, Object arg)
{
System.out.println("student go home ....");
}
}
package com.skywares.designpattern.observer;
import java.util.Observable;
import java.util.Observer;
/**
* @author Administrator
* 觀察者模式中的具體觀察者角色
*
*/
public class Teacher implements Observer
{
@Override
public void update(Observable o, Object arg)
{
System.out.println("teacher go to office ");
}
}
/**
* 測試實現
*/
package com.skywares.designpattern.observer;
/**
* @author Administrator
*
*/
public class TestObservable
{
/**
* @param args
*/
public static void main(String[] args)
{
Alarm alarm = new Alarm();
Teacher t = new Teacher();
Student s = new Student();
Canteen c = new Canteen();
alarm.addObserver(t);
alarm.addObserver(s);
alarm.addObserver(c);
alarm.signalEnd();
}
}app