zoukankan      html  css  js  c++  java
  • 手写观察者模式

    经常向遇到有的面试官让你手撕观察者

    模拟观察者模式的3个要点:

    1.需要两个接口,观察者,和被观察者。
    2.被观察者接口需要有两个方法, 一个是注册观察者方法,一个是通知观察者方法。
    3.被观察者需要有一个集合,用于储存观察者,注册方法就是向集合里添加对象。通知方法就是遍历集合。

    package com.DesignMode.Observer;
    
    /**
     * 〈一句话功能简述〉;
     * 〈观察者抽象接口〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public interface Observer {
    
        public void update(int tmp);
    }
    package com.DesignMode.Observer;
    
    /**
     * 〈一句话功能简述〉;
     * 〈被观察者接口〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public interface Subject {
    
        //注册观察者
        public void regist(Observer o);
    
        //移除观察者
        public void remove(Observer o);
    
        //通知观察者
        public void notifyObserver();
    }
    package com.DesignMode.Observer;
    
    import java.util.ArrayList;
    
    /**
     * 〈一句话功能简述〉;
     * 〈被观察者具体实现〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class Wheather implements Subject {
    
        private ArrayList<Observer> list = new ArrayList<>();
    
        private int tmp = 2;
    
        @Override
        public void regist(Observer o) {
            list.add(o);
    
        }
    
        @Override
        public void remove(Observer o) {
            list.remove(o);
        }
    
        @Override
        public void notifyObserver() {
            if(list != null && list.size() > 0) {
                for(int i=0;i<list.size();i++) {
                    //遍历通知所有观察者
                    list.get(i).update(tmp);
                }
            }
        }
    
        public void setTmp(int tmp) {
            this.tmp = tmp;
            notifyObserver();
        }
    }
    package com.DesignMode.Observer;
    
    /**
     * 〈一句话功能简述〉;
     * 〈观察者1〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class Observer1 implements Observer {
    
        @Override
        public void update(int tmp) {
            System.out.println("Observer1:" + tmp);
        }
    }
    package com.DesignMode.Observer;
    
    /**
     * 〈一句话功能简述〉;
     * 〈观察者2〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class Observer2 implements Observer {
    
        @Override
        public void update(int tmp) {
            System.out.println("Observer2:" + tmp);
        }
    }

    测试代码:

    package com.DesignMode.Observer;
    
    /**
     * 〈一句话功能简述〉;
     * 〈功能详细描述〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class TestObserver {
    
        public static void main(String[] args){
            Wheather w = new Wheather();
            Observer1 o1 = new Observer1();
            Observer2 o2 = new Observer2();
            w.regist(o1);
            w.regist(o2);
    
            w.setTmp(10);
        }
    }

    测试结果:

    Observer1:10
    Observer2:10
  • 相关阅读:
    Sql日期时间格式转换
    基于现有数据库的Code First模式迁移更新数据库
    EF Code First Migrations数据库迁移
    IE6 IE7 ‘JSON’ 未定义
    解决iis7只能上传30M文件的限制
    在ASP.NET MVC中使用Juqery实现页面局部刷新
    asp.net mvc3 利用Ajax实现局部刷新
    CS0234: 命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Html、Ajax”(是否缺少程序集引用?)
    陨石坑之webapi使用filter
    Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
  • 原文地址:https://www.cnblogs.com/jxxblogs/p/12209786.html
Copyright © 2011-2022 走看看