观察者模式
- 观察者模式又被称为发布——订阅模式,属于行为型设计模式的一种,是一个在项目中经常使用的模式。
- 定义:定义对象间一种一对多的依赖关系,每当一个对象改变状态时,则所有依赖于他的对象都会得到通知并被自动更新。
四个角色
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");
}
- 其实这段代码逻辑还是非常简单的
- 我们将观察者比作公众号的关注人群
- 那么公众号就是被观察者
- 公众号通过一个集合来管理被观察者,实现公众号的被关注,被取消关注
- 然后公众号有推送消息的功能,推送的消息能被所有用户监听到
- 至于将观察者与被观察者都抽出成接口,肯定是方便继承管理,即为了以后的可扩展性,又增加了程序的低耦合