Observer模式又叫做观察者模式,当观察对象状态发生变化的时候,就会通知给观察者。这种模式适用于根据对象状态进行响应的场景!

实例程序是一个输出数字的程序。

  • 观察者Observer类用于每500ms监测着数字是否发生变化
package site.wangxin520.gof.observer.damo;

/**
 * 监听器模式
 * @author wangXgnaw
 *
 */
public class Observer {

    private Event event;
    private boolean canRun = true;

    /**
     * 传入需要监听的对象
     * @param event
     */
    public Observer(Event event) {
        this.event = event;
    }

    /**
     * 开始监听,监听者event事件中的数字的变化
     */
    public void startObserver() {
        System.out.println("监听器启动");
        int srcNum = event.getNum();
        while (canRun) {
            int num = event.getNum();
            //这里设置了线程的睡眠方法,相当于每秒只扫描两次
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("监听器正在扫描!!");
            //当数字改变时候,就输出
            if (num != srcNum) {
                System.out.println("检测到数字改变为:" + num);
                srcNum=num;
            }

        }
    }
}
  • Event抽象事件类,用于规范方法,方便后期的改变
package site.wangxin520.gof.observer.damo;

/**
 * 监听器监听对事件的抽象类
 * @author wangXgnaw
 *
 */
public abstract class Event {

    /**
     * 设置抽象方法,返回数字
     * @return int 返回数字
     */
    public abstract int getNum();
    
}
  • NumEvent数字事件类,是Event抽象类的实现
package site.wangxin520.gof.observer.damo;

/**
 * 抽象类的实现
 * @author wangXgnaw
 *
 */
public class NumEvent extends Event{

    private static int num=0;
    private int outNum=0;
    
    /**
     * 这里设置的是,只要调用了这个方法,num就会加一
     */
    @Override
    public int getNum() {
        num++;
        
        //相当于每调用三次改变数字
        if(num%3==0){
            outNum=num;
        }
        return outNum;
    }

}
  • Test,观察者模式的测试类
package site.wangxin520.gof.observer.damo;

/**
 * 观察者模式的测试类
 * @author wangXgnaw
 *
 */
public class Test {

    public static void main(String[] args) {
        
        Event event=new NumEvent();
        Observer ob=new Observer(event);
        //开启观察者模式
        ob.startObserver();
        
    }
    
}
  • 结果:

image

观察者模式多用于消息队列的发布与订阅。以后会经常用到,需多加注意!

posted on 2017-10-24 06:52  博客王大锤  阅读(186)  评论(0编辑  收藏  举报