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

      

     
  • 相关阅读:
    EF Core 执行SQL语句和存储过程
    SQL优化之SELECT COUNT(*)
    SQL优化之SQL 进阶技巧(下)
    SQL优化之SQL 进阶技巧(上)
    旅游攻略:重庆红色之旅
    ASP.NET Core在CentOS上的最小化部署实践
    Windows平台部署Asp.Net Core应用
    kali 免杀工具shellter安装以及使用
    Ubuntu Server18.04配置静态IP
    Centos7系统配置静态IP
  • 原文地址:https://www.cnblogs.com/xubiao/p/5472405.html
Copyright © 2011-2022 走看看