• 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...
  • 相关阅读:
    VB程序逆向反汇编常见的函数(修改版)
    [反汇编练习] 160个CrackMe之009
    [反汇编练习] 160个CrackMe之008
    [反汇编练习] 160个CrackMe之007
    [反汇编练习] 160个CrackMe之006
    Delphi反汇编内部字符串处理函数/过程不完全列表
    [反汇编练习] 160个CrackMe之005
    [反汇编练习] 160个CrackMe之004
    新建Django配置
    mysql 常用命令大全
  • 原文地址:https://www.cnblogs.com/xiaosiyuan/p/6485041.html
Copyright © 2020-2023  润新知