1. 认识观察者模式
1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。
2. 组织结构:
- Subject:目标对象类,会被多个观察者监视;目标类必须提供对观察者的维护操作,即注册和销毁;目标对象的状态发送变化时,必须通知监视该对象的所有有效观察者
- Observer:观察者的接口,定义被观察对象发送变化时进行通知的方法,在这个方法内进行业务处理
- SubjectImpl:具体的目标实现类
- ObserverImpl:观察者具体实现类,用来接受目标对象的通知,并进行对应的处理
3. 参考代码:
/** * @ClassName:Observer * @Description:观察者接口 */public interface Observer { //传入目标对象,获取其状态的更新变化,执行对应的处理 public void update(Subject s); }public class ObserverImpl1 implements Observer{ //观察者的状态 private String state; @Override public void update(Subject s) { //更新观察者的状态属性 state=((SubjectImpl1)s).getState(); }}/** * @ClassName:Subject * @Description:被观察的目标对象 */public class Subject { //保存观察自己的观察者对象 Listlist=new LinkedList (); //注册观察者对象 public void regist(Observer ob){ list.add(ob); } //移除观察者对象 public void remove(Observer ob){ list.remove(ob); } //通知所有观察者状态改变 public void notifyObserver(){ for(Observer ob:list){ ob.update(this); } }}public class SubjectImpl1 extends Subject{ //注意,这里的state属性只是做一个示例,可以是其他的属性名,属性类型也可以是其他任意类型 private String state; public String getState() { return state; } public void setState(String state) { this.state = state; //状态更新,通知观察者 notifyObserver(); }}
2. 理解观察者模式
1. 目标与观察者之间是一对多的关系,但是观察者也可以观察多个目标对象,可以在观察者内部添加多个update方法来进行对不同的目标对象进行观察,也可以写在一个update方法内但需要进行区分,对于不同的目标对象进行不同的处理。
2. jdk中提供的观察者模式的相关类:java.util.Observable类,它实现了大部分目标对象所需要的方法;还有一个java.util.Observer接口,该接口是观察者接口,只包括了一个观察者实现类应该实现的update方法