一: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