您的位置:首页 > 其它

设计模式---观察者模式

2017-09-23 22:28 148 查看

定义

在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

理解

一系列类似的对象,例如张三、李四、王五,订了报社的报纸。报社有新的报纸的时候,只要你是他们的订户,你就一直能收到报纸。

看到这种需求,也许你会想到保存张三、李四、王五的引用,“有新报纸”的时候,调用循环调用这些引用的某个更新方法,以达到更新所有依赖对象的目的。

观察者模式其实就是这个思路。在这个模式中,报社叫“主题/被观察者/可观察者”,张三、李四、王五这些叫“观察者”。观察者可以“订阅”主题,主题更新状态后观察者就能得到通知,并更新自己。

代码

观察者接口及其实现类:

public interface Observer {
public void update(int result);
}

public class ZhangSan implements Observer {

public ZhangSan(Subject subject) {
subject.registerObserver(this);
}

@Override
public void update(int result) {
Log.e("ZXK","ZhangSan---result:"+result);
}
}

public class LiSi implements Observer {

public LiSi(Subject subject) {
subject.registerObserver(this);
}

@Override
public void update(int result) {
Log.e("ZXK","LiSi---result:"+result);
}
}

public class WangWu implements Observer {

public WangWu(Subject subject) {
subject.registerObserver(this);
}

@Override
public void update(int result) {
Log.e("ZXK","WangWu---result:"+result);
}
}


主题接口及其实现类:

public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}

public class Press implements Subject {

private ArrayList<Observer> observers;

public Press() {
observers = new ArrayList<>();
}

@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}

@Override
public void removeObserver(Observer observer) {
int index = observers.indexOf(observer);
if(index>=0){
observers.remove(index);
}
}

@Override
public void notifyObservers() {
int result = new Random().nextInt(10);
for(int i = 0;i<observers.size();i++){
Observer observer = observers.get(i);
observer.update(result);
}
}
}


测试:

Press press = new Press();
ZhangSan zhangSan = new ZhangSan(press);
LiSi liSi = new LiSi(press);
WangWu wangWu = new WangWu(press);
press.notifyObservers();




总结

观察者模式的实现方式有很多种,本文将的是最常见的一种。

观察者模式作用:相当于“一对多”版本的接口,观察者订阅后,主题一旦更新,观察者们会立刻得到通知。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: