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(); } }
- 结果:
观察者模式多用于消息队列的发布与订阅。以后会经常用到,需多加注意!