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

    什么是观察者模式呢?

    就是主题对象和依赖对象的一对多的关系,当主题变化时,依赖对象都能收到通知。也有人说是生产者和消费者关系,不管怎么说理解了就行。

    场景:很多用户都订阅一篇新闻,当这篇新闻有变化时,订阅的用户都能收到通知

    实现:

    抽象一个观察者,它可以根据订阅的主题和状态值进行后续操作

    interface Observer {
        void update(Subject subject, int val);
    }
    

      

    定义读者1

    class ObserverOne implements Observer {
    
        @Override
        public void update(Subject subject, int val) {
            System.out.println(String.format("观察者1收到主题[%s]的值改变为[%d]", subject.toString(), val));
        }
    }
    

      

    定义读者2

    class ObserverTwo implements Observer {
    
        @Override
        public void update(Subject subject, int val) {
            System.out.println(String.format("观察者2收到主题[%s]的值改变为[%d]", subject.toString(), val));
        }
    }
    

      

    抽象一个主题

    abstract class Subject {
    
        private List<Observer> observers = new ArrayList<Observer>();
    
        void register(Observer observer) {
            this.observers.add(observer);
        }
    
        void remove(Observer observer) {
            this.observers.remove(observer);
        }
    
        void notify(int val) {
            for(Observer o : observers) {
                o.update(this, val);
            }
        };
    }

    定义一个新闻,读者1、2可以对其订阅

    class NewsSubject extends Subject {
    
        String name;
    
        int val;
    
        NewsSubject(String name, int val) {
            this.name = name;
            this.val = val;
        }
    
        void change(int val) {
            int rawVal = this.val;
            this.val = val;
            System.out.println(String.format("[%s]的状态由[%d]变为[%d]",name, rawVal, val));
            notify(val);
        }
    
        @Override
        public String toString() {
            return name;
        }
    }

    读者1、2订阅了一条新闻,当新闻变动了,比如有新评论了,读者1,2都能收到通知

    
    
    public class ObserverDemo {
        public static void main(String[] args) {
            Observer observerOne = new ObserverOne();
            Observer observerTwo = new ObserverTwo();
            NewsSubject subject = new NewsSubject("新闻", 1);
            subject.register(observerOne);
            subject.register(observerTwo);
            subject.change(10);
            subject.change(20);
        }
    }
    

      

     
  • 相关阅读:
    QT中的定时器使用
    range()函数常和len()函数一起用于字符串索引。在这里我们要显示每一个元素及其索引值。
    range()的print 《P核》P30
    2.13 带逗号的print语句输出的元素之间自动带个空格
    Python3.x和Python2.x的区别
    print语句默认每行添加一个换行符 来自2.13
    2.12 while循环 print与计数器先后顺序对结果的影响
    函数本地绑定与全局绑定的区别
    字典映射{ :}
    《Python核心编程》P21输入数值字符串→转整型
  • 原文地址:https://www.cnblogs.com/xubiao/p/5472405.html
Copyright © 2011-2022 走看看