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

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

    这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

    观察者模式通常由4部分组成,抽象的被观察者、具体的被观察者、抽象的观察者、具体的观察者。

    代码示例

    1、抽象的观察者

    public interface Watcher {
    
        void update();
    }

    2、抽象的被观察者

    public interface Subject {
    
        /**
         * 添加观察者
         * @param watcher
         */
        void addWatcher(Watcher watcher);
    
        /**
         * 删除观察者
         * @param watcher
         */
        void deleteWatcher(Watcher watcher);
    
        /**
         * 被观察者行为
         */
        void service();
    
    }

    这里方法service定义了被观察者的某种行为,当这种行为发生某种变化时将通知所有观察者。

    3、具体的被观察者

    public class ConcreteSubject implements Subject {
    
        private List<Watcher> watchers = new ArrayList<>();
    
        private Integer value = 0;
    
        @Override
        public void addWatcher(Watcher watcher) {
            watchers.add(watcher);
        }
    
        @Override
        public void deleteWatcher(Watcher watcher) {
            watchers.remove(watcher);
        }
    
        @Override
        public void service() {
            System.out.println("被观察者做了一些事情,更新标识并通知所有观察者");
            setValue(1);
            notifyAllWatcher();
        }
    
        private void notifyAllWatcher() {
            if(getValue().equals(1))
            {
                for(Watcher watcher : watchers)
                {
                    watcher.update();
                }
            }
    
        }
    
        public Integer getValue() {
            return value;
        }
    
        public void setValue(Integer value) {
            this.value = value;
        }
    }

    4、具体的观察者

    public class FirstWatched implements Watcher {
        @Override
        public void update() {
            System.out.println("first watched updated...");
        }
    }
    public class SecondWatched implements Watcher {
        @Override
        public void update() {
            System.out.println("second watched updated...");
        }
    }

    5、测试代码

    public class Main {
    
        public static void main(String[] args) {
            Watcher firstWatched = new FirstWatched();
            Watcher secondWatched = new SecondWatched();
            Subject subject = new ConcreteSubject();
    
            subject.addWatcher(firstWatched);
            subject.addWatcher(secondWatched);
            subject.service();
        }
    }

    6、输出

    被观察者做了一些事情,更新标识并通知所有观察者
    first watched updated...
    second watched updated...
  • 相关阅读:
    xdvipdfmx:fatal: Unable to open "xxx.pdf". Output file removed. fwrite: Broken pipe xelatex.exe
    安装Visual Studio 时窗口闪过就退出
    一些概念的收集
    如何让字符串中奇怪的空格现出原形
    mysql替换特殊字符
    asscii码对应表
    Linux下的tar压缩解压缩命令详解
    centos 6.8 /etc/sysconfig/下没有iptables的问题
    mysqldumpslow简单用法
    linux查询占用空间较大的文件
  • 原文地址:https://www.cnblogs.com/xiaosiyuan/p/6485041.html
Copyright © 2011-2022 走看看