zoukankan      html  css  js  c++  java
  • 【Java设计模式】观察者模式

    适用于消息订阅,通知发布等场景:

        //被观察者
        public interface Observed {
            /**
             * 注册观察者
             * @param o
             * 观察者
             */
            void registerObserver(Observer o);
    
            /**
             * 移除观察者
             * @param o
             * 观察者
             */
            void removeObserver(Observer o);
    
            /**
             * 唤醒观察者
             */
            void notifyObserver();
        }

        //观察者
        public interface Observer {
            void update(String message);
        }

        //被观察者实现类,即被订阅方
        public class Producer implements Observed {
            private List<Observer> list = new LinkedList();
            private String msg;
            @Override
            public void registerObserver(Observer o) {
                list.add(o);
            }
    
            @Override
            public void removeObserver(Observer o) {
                list.remove(o);
            }
    
            @Override
            public void notifyObserver() {
                for (Observer o : list){
                    o.update(msg);
                }
            }
    
            public void setMsg(String msg) {
                this.msg = msg;
                System.out.println("发布消息:"+msg);
                notifyObserver();
            }
        }

        //观察者实现类,即用户方
        public class User implements Observer {
            private String msg;
            private String name;
            public User(String name){
                this.name = name;
            }
            @Override
            public void update(String message) {
                this.msg = message;
                read();
            }
            public void read(){
                System.out.println(this.name + " 收到消息:"+msg);
            }
        }

        //测试类
        public class Test {
            public static void main(String[] args) {
                User user1 = new User("悟空");
                User user2 = new User("八戒");
                User user3 = new User("沙僧");
    
                Producer producer = new Producer();
    
                producer.registerObserver(user1);
                producer.registerObserver(user2);
                producer.registerObserver(user3);
    
                producer.setMsg("饿死了,还没吃饭");
    
                producer.removeObserver(user2);
    
                producer.setMsg("困死了,还没睡觉");
    
            }
        }

        //输出
        发布消息:饿死了,还没吃饭
        悟空 收到消息:饿死了,还没吃饭
        八戒 收到消息:饿死了,还没吃饭
        沙僧 收到消息:饿死了,还没吃饭
        发布消息:困死了,还没睡觉
        悟空 收到消息:困死了,还没睡觉
        沙僧 收到消息:困死了,还没睡觉
  • 相关阅读:
    Selenium自动化Chrome浏览器 在windows下窗口最大化
    Linux下的压缩解压缩命令详解及实例
    Windows下及Mac下的IntelliJ IDEA快捷键
    Missing artifact com.oracle:ojdbc6:jar:10.2.0.4.0问题解决 ojdbc包pom.xml出错
    使用cmd命令进行导入
    导入dmp文件时,需要删除原有ORACLE数据库实例
    HTML编码规范、CSS编码规范
    javascript函数与表达式
    JS中闭包、函数与对象的介绍和用法
    JS中typeof和instanceof用法区别
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286692.html
Copyright © 2011-2022 走看看