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...
  • 相关阅读:
    PAT 甲级 1132 Cut Integer (20 分)
    AcWing 7.混合背包问题
    AcWing 9. 分组背包问题
    AcWing 5. 多重背包问题 II
    AcWing 3. 完全背包问题
    AcWing 4. 多重背包问题
    AcWing 2. 01背包问题
    AcWing 875. 快速幂
    AcWing 874. 筛法求欧拉函数
    AcWing 873. 欧拉函数
  • 原文地址:https://www.cnblogs.com/xiaosiyuan/p/6485041.html
Copyright © 2011-2022 走看看