A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1. 观察者模式
观察者模式属于设计模式中的行为型模式,主要用于对象间存在一对多的关系的时候。
  • 作用:在一对多的对象关系中,当主对象的状态发生改变时,所有依赖于它的对象都将会被自动更新并得到通知。
  • 解决的问题:向其它对象通知主对象的改变。
  • 何时使用:当主对象的状态发生改变时,所有依赖于它的对象都将得到通知。
  • 使用场景:
    • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
    • 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
    • 一个对象必须通知其他对象,而并不知道这些对象是谁。
    • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
    • 2.在微信公众服务中的实现示例
      subject.java 主对象接口
      [size=1em]
      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      package com.example.jingbin.designpattern.observer.interfaces;


      /**
      * Created by jingbin on 2016/10/21.
      * 专题接口,所有的主题必须实现此接口
      */
      public interface Subject {

          /**
           * 注册一个观察者
           */
          public void registerObserver(Observer observer);

          /**
           * 移除一个观察者
           */
          public void removeObserver(Observer observer);

          /**
           * 通知所有观察者
           */
          public void notifyObservers();
      }





      ObjectFor3D.java 实现主对象
    • [size=1em]
      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      package com.example.jingbin.designpattern.observer.classs;

      import com.example.jingbin.designpattern.observer.interfaces.Observer;
      import com.example.jingbin.designpattern.observer.interfaces.Subject;

      import java.util.ArrayList;

      /**
      * Created by jingbin on 2016/10/21.
      * 接下来3D服务号的实现类:
      */

      public class ObjectFor3D implements Subject {

          private ArrayList<Observer> observers = new ArrayList<>();

          /**
           * 3D 彩票的号码
           */
          private String msg;

          @Override
          public void registerObserver(Observer observer) {
              observers.add(observer);
          }

          @Override
          public void removeObserver(Observer observer) {
              int index = observers.indexOf(observer);
              if (index >= 0) {
                  observers.remove(index);
              }
          }

          @Override
          public void notifyObservers() {
              for (Observer observer : observers) {
                  observer.update(msg);
              }
          }

          /**
           * 主题更新信息
           */
          public void setMsg(String msg) {
              this.msg = msg;
              notifyObservers();
          }
      }






      file:///C:/Users/JingLicheng/AppData/Local/YNote/data/qq252DD3FEFB0DF13930DD5571FC7D94A3/e0d7a9af390e4d02903d7cb15a46123a/clipboard.png
      Observer.java 观察者接口
      [size=1em]
      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      package com.example.jingbin.designpattern.observer.interfaces;

      /**
      * Created by jingbin on 2016/10/21.
      * 所有观察者需要实现此接口
      */
      public interface Observer {

          public void update(String msg);
      }






      file:///C:/Users/JingLicheng/AppData/Local/YNote/data/qq252DD3FEFB0DF13930DD5571FC7D94A3/c007487f8c234007a02b8ba1169881fb/clipboard.png
      ObserverUser1.java 第一个观察者的实现
      [size=1em]
      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      package com.example.jingbin.designpattern.observer.classs;

      import android.util.Log;

      import com.example.jingbin.designpattern.observer.interfaces.Observer;
      import com.example.jingbin.designpattern.observer.interfaces.Subject;

      /**
      * Created by jingbin on 2016/10/21.
      * 模拟第一个使用者
      */

      public class ObserverUser1 implements Observer {

          public ObserverUser1(Subject subject) {
              subject.registerObserver(this);
          }

          @Override
          public void update(String msg) {
              Log.e("-----ObserverUser1 ", "得到 3D 号码:" + msg + ", 我要记下来。 ");
      //        Toast.makeText(PatternApplication.getInstance(), "-----ObserverUser1 得到 3D 号码:" + msg, Toast.LENGTH_SHORT).show();
          }
      }





      ObserverUser2.java 第二个观察者的实现
      [size=1em]
      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      package com.example.jingbin.designpattern.observer.classs;

      import android.util.Log;

      import com.example.jingbin.designpattern.observer.interfaces.Observer;
      import com.example.jingbin.designpattern.observer.interfaces.Subject;

      /**
      * Created by jingbin on 2016/10/21.
      * 模拟第二个使用者
      */

      public class ObserverUser2 implements Observer {

          public ObserverUser2(Subject subject) {
              subject.registerObserver(this);
          }

          @Override
          public void update(String msg) {
              Log.e("-----ObserverUser2 ", "得到 3D 号码:" + msg + ", 我要告诉舍友们。");
      //        Toast.makeText(PatternApplication.getInstance(), "-----ObserverUser2 得到 3D 号码:" + msg, Toast.LENGTH_SHORT).show();
          }
      }






      file:///C:/Users/JingLicheng/AppData/Local/YNote/data/qq252DD3FEFB0DF13930DD5571FC7D94A3/a314cc198b9b4e17b8bf05239ea0b7f5/clipboard.png
      测试
      [size=1em]
      1

      2

      3

      4

      5

      6

      7

      8

      // 创建服务号
      objectFor3D = new ObjectFor3D();
      // 创建两个订阅者
      observerUser1 = new ObserverUser1(objectFor3D);
      observerUser2 = new ObserverUser2(objectFor3D);
      // 两个观察者,发送两条信息
      objectFor3D.setMsg("201610121 的3D号为:127");
      objectFor3D.setMsg("20161022 的3D号为:000");






      file:///C:/Users/JingLicheng/AppData/Local/YNote/data/qq252DD3FEFB0DF13930DD5571FC7D94A3/68c30ce91c254a21a40ab9f5610e6131/clipboard.png
      运行结果
      file:///C:/Users/JingLicheng/AppData/Local/YNote/data/qq252DD3FEFB0DF13930DD5571FC7D94A3/8e91fa7efe004098ad3498db453984e7/clipboard.png

      file:///C:/Users/JingLicheng/AppData/Local/YNote/data/qq252DD3FEFB0DF13930DD5571FC7D94A3/00b2b937843740a68398d3bb7255b715/clipboard.png




      如上所示,观察者模式实现了当主对象改变时,其它对象都将会被自动更新
      3. 观察者模式的优点和缺点
      • 优点:
        • 观察者与被观察者之间没有紧密耦合,主对象只知道一个观察者列表,并不知道任何一个观察者
        • 当主对象的数据改变时,会对观察者发出通知,观察者的数据也随之改变
      • 缺点:
        • 如果一个主对象的观察者有很多,通知观察者会耗费大量的时间
        • 如果主对象和观察者之间存在循环依赖,会导致系统崩溃
        • 观察者不知道主对象是如何变化的,只知道主对象发生了变化



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马