• 观察者模式


    什么是观察者模式呢?

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

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

    实现:

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

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

      

     
  • 相关阅读:
    Objective-C-----协议protocol,代码块block,分类category
    iOS-Core Data 详解
    TCP、UDP详解
    springboot+mybatisplus配置多个mapper路径
    django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb的解决方法
    Django笔记——Eclipse+pydev首个django例子helloworld
    eclipse html插件的下载和安装
    sqlserver往字符串里固定位置插入字符
    在文件夹中直接调用命令提示符
    HTML:如何将网页分为上下两个部分
  • 原文地址:https://www.cnblogs.com/xubiao/p/5472405.html
Copyright © 2020-2023  润新知