观察者模式,从名字来讲就是观察的意思,
一个比较有意思的例子,考试作弊是怎样的?
一个或者多个望风的,其他的紧锣密鼓的抄,一有情况,赶紧停下来。
没错,观察者模式也大概就是这样的流程。
先看类图:
上述类图为了使程序代码更容易扩展,将subject和observer都抽象出来了一层,降低了耦合度。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在自己状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己。
也就是如果这样一种情况:当一个对象的改变需要同时改变其他对象的时候,则优先考虑观察者模式。
观察者模式所做的工作其实就是在接触耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,
从而使的格子变化都不会影响到另一边的变化。
下面看看具体代码:
Observer类:
package com.blog.anla.Observer;
/**
* 通知模式(observer)又叫发布订阅模式(Publish/Subscribe)
*
* 抽象观察者,update方法用于从
* 通知者中获得最新的信息
* @author U-ANLA
*
*/
public abstract class Observer {
public abstract void update();
}
Subject类:
package com.blog.anla.Observer;
import java.util.ArrayList;
import java.util.List;
/**
* 它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者
* 抽象主题提供一个接口,可以增加和删除观察者对象
* @author U-ANLA
*
*/
public abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
observers.remove(observer);
}
/**
* 通知每一个观察者
*/
public void myNotify(){
for(int i = 0;i < observers.size();i++){
observers.get(i).update();
}
}
}
ConcreteObserver类:
package com.blog.anla.Observer;
/**
* 具体的观察者。
* @author U-ANLA
*
*/
public class ConcreteObserver extends Observer{
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject ,String name) {
this.subject = subject;
this.name = name;
}
@Override
public void update() {
observerState = subject.getSubjectState();
System.out.println("观察者:" + name + "的新状态是"+observerState);
}
public ConcreteSubject getSubject() {
return subject;
}
public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}
}
ConcreteSubject类:
package com.blog.anla.Observer;
/**
* 具体主题或者具体主题统治者,将有关状态存入具体观察者
* 对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知
* @author U-ANLA
*
*/
public class ConcreteSubject extends Subject{
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
观察者模式有点绕,我也还需要多看些实际例子去理解的!
赠人玫瑰手留余香(oo)