简单Android项目-微博客户端中观察者模式的运用

GitHub链接地址:https://github.com/xiaosong520/ObserverPatternDemo

一、观察者模式介绍

  观察者模式定义了一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听。当这个主题对象状态变化时,会通知所有观察者对象并作出相应处理逻辑。

二、从源码中分析观察者模式

  观察者模式定义了四种角色:抽象主题、具体主题、抽象观察者、具体观察者。

   抽象主题(Subject):该角色是一个抽象类或接口,定义了增加、删除、通知观察者对象的方法。

   具体主题(ConcreteSubject):该角色实现了抽象主题中的方法,当自身的状态发生改变时,可向其他观察者发送消息。

   抽象观察者(Observer):该角色是具体观察者的抽象类,定义了一个更新方法。

   具体观察者(ConcrereObserver):该角色是具体的观察者对象,实现了抽象观察者的方法。这些对象可以通过得到的通知后,更新自身的状态。
   如图为此项目中的模型图:

  此程序设计了一个被观察者小嵩的微博客服端,并且拥有几个粉丝(充当观察者)订阅。当粉丝订阅(登记)时,博主小嵩会知道这些粉丝(具体观察者)。当微博博主小嵩更新微博时,自动通知订阅者,即粉丝会收到相应的微博通知。

  抽象主题(Subject)接口:   

  public interface Subject {
  /**
  * 增加观察者
  * @param observer
  */
  public void attach(Observer observer);
  /**
  * 删除观察者
  * @param observer
  */
  public void detach(Observer observer);
  /**
  * 通知观察者
  */
  public void notify(String message, TextView v);
  }

  具体主题ConcreteSubject:(被观察者 小嵩) 

  public class XiaosongSubject implements Subject {

    //用于保存订阅了小嵩的博客的用户
    private List<Observer> mPersonList = new ArrayList<>();

    @Override
    public void attach(Observer observer) {
    mPersonList.add(observer);
    }

    @Override
    public void detach(Observer observer) {
    mPersonList.remove(observer);
    }

    @Override
    public void notify(String message, TextView tv) {
      for (Observer observer : mPersonList) {
    observer.update(message,tv);
      }  
    }
  }

  抽象观察者(Observer):

  public interface Observer {

    public void update(String msg, TextView tv);
  }

  具体观察者(Person):

  public class Person implements Observer {

    // 用户名
    private String name;
    public Person(String name) {
      this.name = name;
    }

    @Override
    public void update(String msg, TextView tv) {
      tv.setText(tv.getText()+name+":"+ msg +"\n");
    }
  }

三、好处

  观察者模式在被观察者和观察者之间建立一个的只是抽象的耦合。小嵩(具体主题,被观察者)所知道的只是一个具体观察者列表(关注自己的粉丝),每一个具体观察者都符合一个抽象观察者的接口。被观察者并不需要认识任何一个具体观察者,它只知道它们都有一个共同的接口。并且观察者模式支持广播通讯,被观察者会向所有的登记过的观察者发出通知。

posted on 2018-10-22 16:28  年轻就行  阅读(239)  评论(0)    收藏  举报