前言
观察者模式.png当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
观察者模式
被观察者,即主题角色:
public abstract class AbstractSubject {
private List<IObserver> observers;
AbstractSubject() {
observers = new ArrayList<>();
}
public void attach(IObserver observer) {
observers.add(observer);
}
public void detach(IObserver observer) {
observers.remove(observer);
}
public void notifyObserver(String content) {
for (IObserver observer : observers) {
observer.update(content);
}
}
}
具体主题ConcreteSubject ,暂时没有任何代码:
public class ConcreteSubject extends AbstractSubject {
}
观察者接口IObserver :
public interface IObserver {
void update(String content);
}
观察者具体类ConcreteObserver :
public class ConcreteObserver implements IObserver {
private final String observerName;
public ConcreteObserver (String observerName) {
this.observerName = observerName;
}
@Override
public void update(String content) {
System.out.println(observerName + "接收到了消息:" + content);
}
}
客户端Client 调用:
public class Client {
public static void main(String[] args) {
AbstractSubject subject = new ConcreteSubject();
IObserver observer1 = new ConcreteObserver("观察者1号");
IObserver observer2 = new ConcreteObserver("观察者2号");
IObserver observer3 = new ConcreteObserver("观察者3号");
subject.attach(observer1);
subject.attach(observer2);
subject.attach(observer3);
subject.notifyObserver("被观察者发生了变化");
}
}
主体思想就是:被观察者调用attach方法将观察者放入自己的集合中,当自己的数据改变时,调用notifyObserver方法去遍历循环,从而调用集合中的每个观察者的update方法,完成数据更新变化的通知。
运行结果是:
观察者1号接收到了消息:被观察者发生了变化
观察者2号接收到了消息:被观察者发生了变化
观察者3号接收到了消息:被观察者发生了变化
观察者模式在Android中的应用
Android中的各种监听器都是应用的观察者模式,RxJava框架也是应用的观察者模式。
总结
观察者模式在Android中应用的还是很广泛的,观察者模式中观察者和被观察者是抽象耦合的,避免了紧耦合等问题,但是如果被观察者较多或者间接被观察者较多的情况下,会导致遍历所花的时间较多,当然这个数量级恐怕很少能达到。至于某些博客说的观察者无法知道被观察者数据是如何变化的是观察者的缺点,这点我并不能苟同,我认为这正是封装的好处,你无需知道内部是如何进行的,这并不是观察者模式的缺点,反而是封装的好处。
喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!作者:zhang_pan
网友评论