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);
        }
    }
    

      

     
  • 相关阅读:
    docker的安装
    Linux的常用命令
    HTTP协议,HTTPS协议,Websocket协议
    常用排序
    go的数组,切片,map
    if-else,switch,for循环
    go的函数,包以及mode的补充
    Android学习笔记——从源码看Handler的处理机制
    ElementUI
    关于IO的理解
  • 原文地址:https://www.cnblogs.com/xubiao/p/5472405.html
Copyright © 2011-2022 走看看