Java设计模式----观察者模式(Observer)

来源:互联网 发布:广州发货的淘宝卖家 编辑:程序博客网 时间:2024/04/29 13:27

1.  观察者模式: 

     观察者模式,也叫发布/订阅模式,定义如下:

     定义对象之间的一种一对多的依赖关系,使得每当一个对象的状态改变时,多有依赖于它的对象都能及时得到通知并被自动更新

2.  观察者模式的相关角色介绍:

     a、 抽象被观察者角色 

     定义被观察者必须实现的职责,它必须能够动态地添加和取消观察者,一般由抽象类构成。仅完成被观察者的职责:管理观察者并通知观察者

     b、 具体被观察者角色

     定义被观察者自己的业务逻辑,同时定义对那些事件发出通知

     c、 抽象的观察者角色

     观察者接收到消息之后进行update操作,即对收到的信息进行处理

     d、 具体的观察者角色

     每个观察者接收到消息之后处理的反应不同,每个观察者都有自己的处理逻辑

3.   观察者模式通用示例代码:

抽象被观察者类:

/** * 抽象主题角色类,也称为抽象主题被观察者 * @author zqkj001 * */public abstract class Subject {    /** * 用来保存注册的注册的观察者对象 */private List<Observer> list=new ArrayList<Observer>();/** * 注册观察者对象到list * @param ob */public void attach(Observer ob){list.add(ob);System.out.println("attach an observer..");}/** * 删除观察者对象 * @param ob */public void detach(Observer ob){list.remove(ob);}/** * 通知所有注册的观察者对象 * @param newState */public void notifyObservers(String newState){for (Observer ob : list) { ob.update(newState);}}}
具体被观察者类:

/** * 具体主题角色类/具体主题被观察者类 * @author zqkj001 * */public class ConcreteSubject extends Subject {      private String state;public String getState() {return state;}public void change(String newState){this.state=newState;System.out.println("主题状态更改为:"+this.state);//状态发生改变,通知各个观察者super.notifyObservers(this.state);}}
抽象观察者类

/** * 抽象观察者角色类 * @author zqkj001 * */public interface Observer {    /** * 更新接口 * @param newState */public void update(String newState);}
具体观察者类

/** * 具体观察者角色类 * @author zqkj001 * */public class ConcreteObserver implements Observer {    private String observerState;@Overridepublic void update(String newState) {//更新观察者状态,使其与目标状态一致this.observerState=newState;        System.out.println("状态为:"+this.observerState);}}
测试类:

public class Client {    public static void main(String[] args) {//创建主题对象(被观察者)ConcreteSubject subject=new ConcreteSubject();//创建观察者对象Observer observer=new ConcreteObserver();//将观察者绑定到主题对象(被观察者)上subject.attach(observer);//改变主题对象(被观察者)的状态 subject.change("a new State");}}

4. 示例代码对应的类图:


5. JDK对观察者模式的支持:

  JDK中提供了:java.util.Observable实现类和java.util.Observer接口,上面的代码中的一个抽象被观察者类和观察者接口可以分别用这2个替换。

  JDK调用示例:

public class ConcreteSubject1 extends Observable {     public void operator(){super.setChanged();super.notifyObservers("改变了");}}
public class ConcreteObserver1 implements Observer {@Overridepublic void update(Observable ob, Object str) {System.out.println("观察者接收到状态:"+str);         }}
public class Test {   public static void main(String[] args) {ConcreteSubject1 ob=new ConcreteSubject1();Observer observer=new ConcreteObserver1();ob.addObserver(observer);ob.operator();}}








     


0 0