• 手写观察者模式


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

    模拟观察者模式的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
  • 相关阅读:
    关于windows CE Platform Builder中模拟器的限制
    送给每天都用电脑的人
    用eVC4开发SmartPhone、Pocket PC程序之 开发工具下载、安装、配置
    在手机上显示图片
    如何禁止回车的使用
    弹出窗口的方法
    Request.Form同Request.querystring的区别.txt
    找前几天
    手机上可移动的图片
    httphandler是做什么的?
  • 原文地址:https://www.cnblogs.com/jxxblogs/p/12209786.html
Copyright © 2020-2023  润新知