欢迎来到农夫的博客

半亩方塘一鉴开, 天光云影共徘徊。 问渠哪得清如许? 为有源头活水来!

设计模式之观察者模式

设计模式之观察者模式


一、什么事观察者模式

  如:有A,B连个独立的对象,其中B想时时知道A中的变化,以便做出相应的相应或对策。这就是观察者模式

  A为被观察者,B为观察者。 A、B同时均可以为被观察者。

  观察者和被观察者N:N的关系。

二、观察者模式的应用

  (1)周期性任务。比如win7下的定时关机命令shutdown -s -t 1200(1200秒后关机)。这些命令当预期系统时间到后,就可以通知相应的观察者激活相应的命令。

  (2)重新加载配置文件。比如好多大型系统的配置文件,都会在每次修改之后自动重新加载。

三、使用Java类实现观察者模式

  java.util.Observable

    -able一般可能...的单词后缀,Observable是可以被观察的,程序中的被观察者类,需要继承这个类。

  java.util.Observer

    这个是观察者,interface。程序中的观察者类,需要实现这个接口中的uupdate()方法。

 

四、观察者模式实现

  1、被观察者,同时也是观察者; 继承Observable称为被观察者,

package com.ssk.Observable;

import java.util.Observable;
import java.util.Observer;
//被观察者
public class NumObservable extends Observable implements Observer{
    int data = 0;
    public void setData(int data){
        this.data = data;
        setChanged();//Marks this <tt>Observable</tt> object as having been changed;
        notifyObservers();//通知所有观察者
    }
@Override
public void update(Observable o, Object arg) { System.out.println("观察者和被观察者互相被观察!!"); } }

  2、观察者同时也是被观察者

package com.ssk.Observable;

import java.util.Observable;
import java.util.Observer;
//观察者
public class NumObserver extends Observable implements Observer {

    @Override
    public void update(Observable o, Object arg) {//有被观察者发生改变,自动调用对应观察者的的update方法
        NumObservable numObservable = (NumObservable) o;
        System.out.println("被观察者Numobservable已改变,data:" + numObservable.data);
        
        setChanged();
        notifyObservers();
    }

}

  3、进行单元测试

  

package com.ssk.Observable;

import org.junit.Test;

public class NumServableTest {
    
    @Test
    public void test(){
        NumObservable numOable = new NumObservable();
        NumObserver numObserver =  new NumObserver();
        numOable.addObserver(numObserver);//被观察者绑定观察者
        numObserver.addObserver(numOable);//被观察者绑定观察者
        numOable.setData(1);
        numOable.setData(2);
        numOable.setData(3);
    }
    
}

 

posted on 2016-09-29 16:54  allTime  阅读(225)  评论(0编辑  收藏  举报

导航