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...
  • 相关阅读:
    职责链模式——行为型模式(1)
    创建型模式总结
    命令模式——行为型模式(2)
    桥接模式——结构型模式(2)
    享元模式——结构型模式(6)
    外观模式——结构型模式(5)
    适配器模式——结构型模式(1)
    组合模式——结构型模式(3)
    oencv学习(10)opencv mul()每个元素相乘
    oencv学习(8)背景消除
  • 原文地址:https://www.cnblogs.com/xiaosiyuan/p/6485041.html
Copyright © 2011-2022 走看看