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

        //输出
        发布消息:饿死了,还没吃饭
        悟空 收到消息:饿死了,还没吃饭
        八戒 收到消息:饿死了,还没吃饭
        沙僧 收到消息:饿死了,还没吃饭
        发布消息:困死了,还没睡觉
        悟空 收到消息:困死了,还没睡觉
        沙僧 收到消息:困死了,还没睡觉
  • 相关阅读:
    Nginx 模块开发(1)—— 一个稍稍能说明问题模块开发 Step By Step 过程
    nginx上传模块—nginx upload module-
    解决nginx上传模块nginx_upload_module传递GET参数
    nginx upload module的使用
    Nginx Upload Module 上传模块
    产品需求分析神器:KANO模型分析法
    SpringBoot @ConditionalOnBean、@ConditionalOnMissingBean注解源码分析与示例
    BAT、网易、京东等如何做大数据风控的?
    springboot 2.x 集成 drools 7.x
    Drools介绍与使用
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286692.html
Copyright © 2011-2022 走看看