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

      

     
  • 相关阅读:
    解决android模拟器太大,小屏幕无法完全显示的问题
    寡人写的第一个HTML5页面
    android开发环境重装系统之后的配置
    PHP程序的一次重构记录
    重构遗留代码(1):金牌大师
    java加密算法研究
    理解Java常量池
    由一个项目看java TCP/IP Socket编程
    java List分组和排序处理
    JAVA获取方法参数名的分析(一)
  • 原文地址:https://www.cnblogs.com/xubiao/p/5472405.html
Copyright © 2011-2022 走看看