浅析观察者模式

观察者模式

  • 观察者模式又被称为发布——订阅模式,属于行为型设计模式的一种,是一个在项目中经常使用的模式。
  • 定义:定义对象间一种一对多的依赖关系,每当一个对象改变状态时,则所有依赖于他的对象都会得到通知并被自动更新。

四个角色

1.Subject

  • 抽象主题,(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。

2.ConcreteSubject

  • 具体主题(具体被观察者)。该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知

3.Observer

  • 抽象观察者,是观察者的抽象类。他定义了一个更新接口,使得在得到主题更改通知时更新自己

4.ConcrereObserver

  • 具体观察者,实现观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

简单实现

  • 先来一个抽象的观察者
public interface Observer {

    public void update(String message);
}
  • 在创建几个实体的观察者
public class ObServer1 implements Observer {
    private String name;
    private String TAG = "Observer1";
    public ObServer1(String name){
        this.name = name;
    }

    @Override
    public void update(String message) {
        Log.d(TAG, "update: name = " + name);
    }
}
  • 然后是抽象的被观察者
public interface Subject {

    /**
     * 增加被观察者
     */
    public void attach (Observer observer);

    /*
        删除被观察者
     */
    public void detach(Observer observer);

    /**
     * 通知订阅者更新消息
     * @param message
     */
    public void notify(String message);
}
  • 实体化一个被观察者
public class SubScriptionSubject implements Subject {

    private List<Observer> mObserverList = new ArrayList<>();

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

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

    @Override
    public void notify(String message) {
        for (Observer observer : mObserverList){
            observer.update(message);
        }
    }
}
  • 最后看看怎么实现被观察
public  void  aaa(){
        SubScriptionSubject subScriptionSubject = new SubScriptionSubject();
        ObServer1 obServer1 = new ObServer1("111");
        subScriptionSubject.attach(obServer1);
        subScriptionSubject.notify("sadsafasga");
    }
  • 其实这段代码逻辑还是非常简单的
  • 我们将观察者比作公众号的关注人群
  • 那么公众号就是被观察者
  • 公众号通过一个集合来管理被观察者,实现公众号的被关注,被取消关注
  • 然后公众号有推送消息的功能,推送的消息能被所有用户监听到
  • 至于将观察者与被观察者都抽出成接口,肯定是方便继承管理,即为了以后的可扩展性,又增加了程序的低耦合

猜你喜欢

转载自blog.csdn.net/asffghfgfghfg1556/article/details/81191926