java设计模式–观察者模式(Observer)
观察者模式的定义:
定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象
都得到通知并被自动更新。
认识观察者模式:
1、目标和观察者之间的关系:
按照模式的定义,目标和观察者之间是典型的一对多的关系。
但是要注意,如果观察者只有一个,也是可以的,这样就变相的实现了目标和观察者之间
一对一的关系。
2、观察者模式中有四种对象:
Subject(目标对象),
Observer(定义观察者接口),
ConcreteSubject(具体的目标实现对象),
ConcreteObserver(观察者的具体实现对象)
一个目标可以有任意多个观察者对象,一旦目标的状态发生了改变,所有注册的观察者都会等到通知,
然后各个观察者会对通知作出相应的响应,执行相应的业务功能处理,并使自己的状态和目标的状态保存一致。
Subject:目标对象接口,提供如下功能:
a.一个目标可以被多个观察者观察
b.目标提供对观察者注册和退订的维护
c.当目标的状态发生变化时,目标负责通知所有注册的,有效的观察者
Observer:观察者的接口,提供目标通知时对应的更新方法,这个方法进行相应的业务处理,可以在这个方法
里面回调目标对象,以获取目标对象的数据。
ConcreteSubject:具体的目标实现对象,用来维护目标状态,当目标对象的状态发生改变时,通知
所有注册的、有效的观察者,让观察者执行相应的处理。
ConcreteObserver:观察者的具体实现对象,用来接收目标的通知,并进行相应的后续处理,比如更新
自身的状态以保持和目标的相应状态一致。
举例:
import java.util.ArrayList;
import java.util.List;
/**
* 功能:
* 目标对象,作为被观察者,它知道观察它的观察者,并提供注册和删除观察者的接口
* @author Administrator
*
*/
public class Subject
{
//用来保存注册的观察者对象,也就是报纸的订阅者
private List readers = new ArrayList();
/**
* 功能:
* 注册观察者对象(报纸的读者需要向报社订阅,先要注册)
* @param observer 观察者对象
*/
public void attach(Observer reader)
{
readers.add(reader);
}
/**
* 功能:
* 删除观察者对象(报纸的读者可以取消订阅)
* @param observer
*/
public void detach(Observer reader)
{
readers.remove(reader);
}
/**
* 功能:
* 通知所有的观察者
* (当有报纸出版后,就要主动的送到读者手中,相当于通知读者)
*/
protected void notifyAllObservers()
{
for(Observer reader : readers)
{
reader.update(this);
}
}
}
/**
* 功能:
* 具体的目标对象,负责把有关状态存入到相应的观察者对象
* 并在自己状态发生改变时,通知各个观察者
* (报纸对象)
* @author Administrator
*
*/
public class NewPaper extends Subject
{
//报纸的具体内容
private String content;