观察者模式的意图是在多个对象之间定义一对多的关系,当一个对象的状态发生改变时,会通知依赖于它的对象,并根据新状态做出反应。
解决的问题:
将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
源码如下:
抽象主图或通知者
public abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
/**
* 增加观察者
* @author 付玉伟
* @time 2015-2-10 下午09:49:20
* @param observer
*/
public void attach(Observer observer){
observers.add(observer);
}
/**
* 移除观察者
* @author 付玉伟
* @time 2015-2-10 下午09:50:18
* @param observer
*/
public void dettach(Observer observer){
observers.remove(observer);
}
/**
* 向观察者们发出通知
* @author 付玉伟
* @time 2015-2-10 下午09:52:04
*/
public void Notify(){
for(Observer o:observers){
o.update();
}
}
抽象观察者
public abstract class Observer {
/**
* 抽象观察者类,为所有的具体观察者定义一个接口,在得到通知时更新自己
* @author 付玉伟
* @time 2015-2-10 下午09:52:49
*/
public abstract void update();
}
具体观察者
public class ConcreteObserver extends Observer {
private String observerState;
private String name;
private ConcreteSubject subject;
public ConcreteObserver(String name, ConcreteSubject subject) {
super();
this.name = name;
this.subject = subject;
}
/**
* 实现抽象观察者中更新方法
*/
@Override
public void update() {
observerState = subject.getSubjectState();
}
public ConcreteSubject getSubject() {
return subject;
}
public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}
}
具体主题或者通知者
public class ConcreteSubject extends Subject {
// 具体观察者的状态
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
客户端调用类
“`
public class Client {
/**
* @author 付玉伟
* @time 2015-2-11 下午06:46:48
* @param args
*/
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.attach(new ConcreteObserver("observer1",subject));
subject.attach(new ConcreteObserver("observer2",subject));
subject.attach(new ConcreteObserver("observer3",subject));
subject.setSubjectState("stateReady");
subject.Notify();
}
}
下面我从网上搜到一个实际运用的例子,方便我们理解和运用
客户支付了订单款项,这时财务需要开具发票,出纳需要记账,配送员需要配货