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

        }
    }

    //输出
    发布消息:饿死了,还没吃饭
    悟空 收到消息:饿死了,还没吃饭
    八戒 收到消息:饿死了,还没吃饭
    沙僧 收到消息:饿死了,还没吃饭
    发布消息:困死了,还没睡觉
    悟空 收到消息:困死了,还没睡觉
    沙僧 收到消息:困死了,还没睡觉
原文地址:https://www.cnblogs.com/cnsec/p/13286692.html