定义
定义对象间一种一对多的依赖关系,是的每当一个对象改变状态,则所有依赖于它的对象都得到通知并自动更新.
类图
observer.png- Subject :抽象主题,也就是被观察者的角色,它把所有观察者对象的引用保存在一个集合里面,每个主题都有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象.
- ConcreteSubject:具体主题,也就是具体被观察者,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变的时候,给所有注册过的观察者发送通知。
- Observer:抽象观察者,该角色是观察者的抽象,它定义了一个更新接口,使得在得到主题的更改通知后更新自己。
- ConcreteObserver:具体的观察者,该角色实现抽象观察者角色所定义的更新接口,使得在得到主题的更改通知后更新自己。
简单实现
这里举一个例子,订阅某个微信公众号,公众号有消息更新会第一时间推送给我们,下面就简单实现一下。
抽象观察者类
//抽象观察者类,为所有具体观察者定义一个接口,在的到通知时通知自己
public interface Observer {
//有更新
public void update(String message);
}
抽象被观察者类对象
//抽象被观察者类
public interface Observable {
//推送消息
void push(String message);
//订阅
void register(Observer observer);
}
具体观察者类
//具体的观察者类,也就是订阅者
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name+","+mesage+"更新了!");
}
}
具体的被观察者类
//具体的被观察者类,也就是订阅的公众号
public class Subscriptions implements Observable {
private List<Observer> mList = new ArrayList<>();//存储订阅者
@Override
public void push(String message) {
for(Observer ob : mList) {
ob.update(message);
}
@Override
public void register(Observer ob) {
mList.add(ob);
}
}
实现
public class Client {
public static void main(String[] args){
//被观察者,这里是公众号
Subscriptions subscription = new Subscriptions();
//观察者,这里是订阅用户
User u1=new User("Tony");
User u2=new User("Tom");
User u3=new User("Tomas");
//订阅
subscription.register(u1);
subscription.register(u2);
subscription.register(u3);
//推送消息
subscription.register("xxx公众号");
}
}
结果
Tony,xxx公众号更新了!
Tom,xxx公众号更新了!
Tomas,xxx公众号更新了!
安卓源码中的使用观察者模式的场景
OnClickListener,对设置OnClickListener来说,View是被观察者,OnClickListener是观察者,二者通过setOnClickListener()方法达成订阅关系。订阅后用户点击按钮的瞬间,Android Framework就会将点击事件发送给已经注册的OnClickListener。采取这样被动的方式,既省去了反复检索状态的资源消耗,也能够达到最高的反馈速度。
网友评论