观察者模式的英文原文是:Define a one-to-many dependency between objects so that when one object changes state, all its depedents are notified and updated automaticlly.意思是:定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,所有依赖于它的对象都会得到通知并且自动更新。
观察者模式的4个角色:
抽象主题角色(Subject):该角色被称为“被观察者”,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色(Observer):该角色为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。
具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
观察者模式的类图:
观察者模式对应的各个类:
抽象主题:
package com.zz.observer; /** * 抽象主题角色 * Copyright 2015年5月30日 * created by txxs * all right reserved */ public interface Subject { //登记一个新的观察者 public void attach(Observer obs); //删除一个登记过的观察者观色 public void detach(Observer obs); //通知所有登记过的观察者的对象 public void notifyObserver(); }
抽象观察者:
package com.zz.observer; /** * 抽象观察者角色 * Copyright 2015年5月30日 * created by txxs * all right reserved */ public interface Observer { public void update(); }
具体主题:
package com.zz.observer; import java.util.Enumeration; import java.util.Vector; /** * 具体主题 * Copyright 2015年5月30日 * created by txxs * all right reserved */ public class ConcreteSubject implements Subject { private Vector<Observer> obsVector = new Vector<Observer>(); //登记一个新的观察者 @Override public void attach(Observer obs) { obsVector.add(obs); } //删除一个登记过的观察者 @Override public void detach(Observer obs) { obsVector.remove(obs); } //通知所有等级过的观察者 @Override public void notifyObserver() { for(Observer ob : obsVector){ ob.update(); } } //返回观察者的Enumeration对象 public Enumeration<Observer> observers(){ return obsVector.elements(); } //改变状态 public void change(){ this.notifyObserver(); } }
具体观察者:
package com.zz.observer; /** * 具体观察者 * Copyright 2015年5月30日 * created by txxs * all right reserved */ public class ConcreteObserver implements Observer { @Override public void update() { //相关业务处理 } }
客户端:
package com.zz.observer; /** * 客户端 * Copyright 2015年5月30日 * created by txxs * all right reserved */ public class Client { public static void main(String args[]){ ConcreteSubject subject = new ConcreteSubject(); Observer obs = new ConcreteObserver(); subject.attach(obs); subject.change(); } }
观察者模式的优点:
1、观察者和被观察者之间是抽象耦合
2、支持广播通信
观察者模式的应用场景:
1、关联行为的场景
2、事件多级触发的场景
3、跨系统消息交换的场景
时间: 2024-10-11 21:39:27