zoukankan      html  css  js  c++  java
  • 观察者模式

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

    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 入门
  • 相关阅读:
    第一节 麒麟系统安装+基础环境搭建(JDK+Scala)
    launchMode之的几种取值
    [JAVA &#183; 0基础]:16.经常使用类
    hdu 2767 Proving Equivalences 强连通缩点
    一个最简单的示例与简单性能分析
    Opencl API解释(一)
    OpenCL 第10课:kernel,work_item和workgroup
    GPU 的硬件基本概念,Cuda和Opencl名词关系对应
    Ubuntu12.04-64bits搭建FFmpeg环境
    ubuntu64bits环境下搭建Opencl的环境
  • 原文地址:https://www.cnblogs.com/binfoo/p/8545851.html
Copyright © 2011-2022 走看看