zoukankan      html  css  js  c++  java
  • 设计模式之——Observer模式

    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

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

  • 相关阅读:
    基于ARM的指纹采集仪的设计与实现
    基于单片机和CPLD的数字频率计的设计
    转来的
    单片机式语音播报伏特表
    汽车驾驶模拟器单片机系统设计
    基于AT89C51的智能矿井环境质量监控系统
    我的理解OpenAPI原理
    关联规则中的支持度与置信度
    LVS-NAT实现负载均衡
    在IIS上部署Analysis Services
  • 原文地址:https://www.cnblogs.com/wangxinblog/p/7721708.html
Copyright © 2011-2022 走看看