• 设计模式之观察者模式--中英文结合理解版


    1.为什么要用到观察者模式,他能给我们什么好处。

       举个例子,一个老师,要布置作业,该如何通知班里的学生呢?第一种方法,去教室、食堂、厕所等地一个个找到学生,然后通知学生们作业。这种方法显然是不现实的。那我们在上学时,是如何得知作业的呢?首先所有学生到教室后,都听老师布置的作业。这样,解放了老师。这里用的这种思想,就是观察者模式。

    2.我们来画一下上述的流程图:

      

    3.代码实现如下:

      1)抽象观察者:

    public interface Observer {
        /**
         * 接受消息
         */
        public void update(String message);
    }

      2)抽象被观察者:

    public interface Subject{
        /**
         * 注册观察者
         */
        public void registerObserver(Observer o);
        /**
         * 移除观察者
         */
        public void removeObserver(Observer o);
        /**
         * 通知消息
         */
        public void notifyObserver();
    
    }

      3)学生: 

    public class Student implements Observer {
       
        private String name;  
        private String message; //观察者需要的消息
    
        public Student(String name) {
            this.name = name;
        }
    
        public void read() {
            System.out.println(name+"收到消息为:"+message);
        }
        //接受消息的实现
        @Override
        public void update(String message) {
            this.message = message;
            read();
    
        }
    }

      4)老师:

    public class Teacher implements Subject {
    
        //注意这个List集合的泛型为Observer接口,设计原则:面向接口编程,而不是面向实现编程
        private List<Observer> list;
        //通知的内容
        private String message;
        //constructor
        Teacher() {
            list = new ArrayList<>();
        }
    
        @Override
        public void registerObserver(Observer o) {
            list.add(o);
        }
    
        @Override
        public void removeObserver(Observer o) {
            if (!list.isEmpty()) {
                list.remove(o);
            }
        }
    
        @Override
        public void notifyObserver() {
            for(Observer observer : list) {
                observer.update(message);
            }
        }
    
        /**
         * 设置信息的时候就全都通知了
         */
        public void setInfomation(String s) {
            this.message = s;
            System.out.println("服务更新消息:" + s);
            notifyObserver();
        }
    }

      5)调用:

    public class Main {
        public static void main(String[] args) {
            Teacher server = new Teacher();
            Observer zhaopd= new Student("zhaopd");
            Observer chenmy= new Student("chenmy");
            Observer chzh= new Student("chzh");
            server.registerObserver(zhaopd);
            server.registerObserver(chenmy);
            server.registerObserver(chzh);
            server.setInfomation("Java 是世界上最好的语言");
    
            System.out.println("-------------------");
    
            server.removeObserver(chzh);
            server.setInfomation("我说谎了");
        }
    }

    4.关于观察者模式和发布-订阅模式:

      我个人以为是不一样的...区别是一个发布-订阅有调度中心,观察者模式没有,相当于一个是老师在黑板上留言通知,一个是直接喊话通知。

  • 相关阅读:
    jquery 初篇
    python作用域和js作用域的比较
    javascript作用域
    第三篇、dom操作续
    dom事件
    第二篇 dom内容操作之value
    第三篇、变量
    第二篇、常量
    Node.js
    测试用例
  • 原文地址:https://www.cnblogs.com/zpdMulti/p/596957458_qq19.html
Copyright © 2020-2023  润新知