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("困死了,还没睡觉");
    
            }
        }

        //输出
        发布消息:饿死了,还没吃饭
        悟空 收到消息:饿死了,还没吃饭
        八戒 收到消息:饿死了,还没吃饭
        沙僧 收到消息:饿死了,还没吃饭
        发布消息:困死了,还没睡觉
        悟空 收到消息:困死了,还没睡觉
        沙僧 收到消息:困死了,还没睡觉
  • 相关阅读:
    第三节:模板模式——在Spring框架应用
    第二节:模板模式——模板模式应用
    idea ---- intelij IDEA安装
    计算机基础 ---- 编码(er)
    preg_match一些问题
    php 两个值进行比较的问题
    php中in_array一些问题
    配置完php.ini中的扩展库后,重启apache出现错误1067
    基于Intel 174;E810 的OVS-DPDK VXLAN TUNNEL性能优化
    tc filter 工作模式:传统模式和 direct-action 模式
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286692.html
Copyright © 2011-2022 走看看