观察者模式就是发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
结构图
以公众号推送消息为例:
//抽象观察者
//定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
interface IObserver{
void update(String msg);
}
//观察者:实现了update方法
class User implements IObserver{
@Override
public void update(String msg) {
Log.e(TAG, "receive msg = " + msg);
}
}
//抽象被观察者接口:声明了添加、删除、通知观察者方法
interface ISubject{
void registerObserver(IObserver obs);
void unregisterObserver(IObserver obs);
void notifyObserver(String msg);
}
//被观察者,如公众号推送消息
//实现了ISubject接口,对ISubject接口的三个方法进行了具体实现
class Publisher implements ISubject{
List<IObserver> ObserverList = new ArrayList<>();
@Override
public void registerObserver(IObserver obs) {
if( !ObserverList.contains(obs)){
ObserverList.add(obs);
}
}
@Override
public void unregisterObserver(IObserver obs) {
if (ObserverList.contains(obs)){
ObserverList.remove(obs);
}
}
@Override
public void notifyObserver(String msg) {
if (0 == ObserverList.size()){
return;
}
for (IObserver obs : ObserverList){
Log.e(TAG, obs.getClass().getSimpleName() + " will update msg = " + msg);
obs.update(msg);
}
}
void setInformation(String msg){
notifyObserver(msg);
}
}
使用:定义多个用户,都关注了该公众号,可以接收推送的消息。
User user1 = new User();
User user2 = new User();
User user3 = new User();
Publisher publisher = new Publisher();
publisher.registerObserver(user1);
publisher.registerObserver(user2);
publisher.registerObserver(user3);
publisher.setInformation("this msg is from publisher1");
publisher.unregisterObserver(user2);
publisher.setInformation("this msg is from publisher2");
参考: