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

        //输出
        发布消息:饿死了,还没吃饭
        悟空 收到消息:饿死了,还没吃饭
        八戒 收到消息:饿死了,还没吃饭
        沙僧 收到消息:饿死了,还没吃饭
        发布消息:困死了,还没睡觉
        悟空 收到消息:困死了,还没睡觉
        沙僧 收到消息:困死了,还没睡觉
  • 相关阅读:
    GridView里的数据转化为datatable进行数据传输
    asp.net给asp:button同时添加服务器事件和JS事件
    .msi文件安装出现2503、2502错误
    初识IO流——创建目录和文件
    WinRAR注册
    Ubuntu14.04.1 阿里apt源
    Pycharm远程调试
    Couldn't create temporary file to work with
    Ubuntu14中supervisor的安装及配置
    Ubuntu14.04安装pip及配置
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286692.html
Copyright © 2011-2022 走看看