观察者模式

以微信服务号和订阅用户为例,来演示观察者模式实现

  1. 微信服务号对应着主题Subject,就是被观察者。
  2. 我们可以抽象出来接口,有三个功能,注册订阅用户,移除用户,推送消息
  3. 订阅用户抽象出来接口Observer,每次Subject推送消息时候,都能收到并且更新
  4. 最后进行测试。

下面是对应具体代码:

  • 实现Suject接口
  • package com.binfoo.observer;
    
    /**
     * 关注公众号的接口,提供三个功能
     */
    public interface Subject {
    
        /**
         * 注册粉丝
         * @param observer
         */
        void registerObserver(Observer observer);
    
        /**
         * 移除粉丝
         * @param observer
         */
        void removeObserver(Observer observer);
    
        /**
         * 主题推送给所有粉丝
         */
        void notifyObservers();
    
    }

     

  • 实现用户Observer接口
  • package com.binfoo.observer;
    
    /**
     * 所有的观察者需要实现此接口
     */
    public interface Observer {
        void update(String msg);
    }

     

  • 具体的主题订阅SoftLearningSuject类
  1. package com.binfoo.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 软件学习公众号主题,实现Subject接口
     */
    public class SoftLearningSubject implements Subject{
        private List<Observer> observerList = new ArrayList<>();
    
        private String msg;
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
            notifyObservers();
        }
    
        @Override
        public void registerObserver(Observer observer) {
            observerList.add(observer);
        }
    
        @Override
        public void removeObserver(Observer observer) {
    
            observerList.remove(observer);
        }
    
        @Override
        public void notifyObservers() {
    
            for (Observer o:observerList){
                o.update(msg);
            }
        }
    }

     

  • 具体的订阅用户UserObserver类
  1. package com.binfoo.observer;
    
    
    /**
     * 用户实现观察者接口
     */
    public class UserObserver implements Observer{
    
        private SoftLearningSubject subject;
    
        public UserObserver(String name,SoftLearningSubject subject){
            this.name = name;
            subject.registerObserver(this);
        }
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public void update(String msg) {
            System.out.println("用户: " + name + " 收到推送信息: " + msg);
        }
    }

     

  • 测试代码
  • package com.binfoo.observer;
    
    public class Test {
        public static void main(String[] args) {
            //1. 创建公众号主题
            //2. 创建三个订阅用户,并且注册到公众号主题
            //3. 公众号推送消息,查看订阅用户收到公众号消息
    
            SoftLearningSubject subject = new SoftLearningSubject();
    
            UserObserver u1 = new UserObserver("张三",subject);
    
            UserObserver u2 = new UserObserver("李四",subject);
    
            UserObserver u3 = new UserObserver("王五",subject);
    
            subject.setMsg("SpringBoot 入门");
    
        }
    }

     

  • 最后观察到控制台
  • 用户: 张三 收到推送信息: SpringBoot 入门
    用户: 李四 收到推送信息: SpringBoot 入门
    用户: 王五 收到推送信息: SpringBoot 入门

     

posted @ 2018-03-11 20:54  binfoo  阅读(202)  评论(0编辑  收藏  举报