什么是监听模式:
定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时会通知所有观察者
使用监听模式可以解决什么问题?
下面我们通过一个需求来说明,现在我们向服务器请求某项数据,但是服务器需要向第三方设备请求且过程时间比较长,如果让用户一直等待这对用户体验来说是不好的,这时候我们就可以使用观察者模式,我们把请求发送出去然后添加一个监听,当服务器端将数据返回我们才通知用户。
主题对象接口
public interface ISubject {
//添加观察者
void addObserver(IObserver observer);
//移除一个观察者
void removeObserver(IObserver observer);
//通知所有观察者
void notifyObserver(String message);
}
主题对象
public class Subject implements ISubject {
//观察者列表
private ArrayList<IObserver> observers = new ArrayList<>();
public Subject(){
}
public void request(final String message){
//模拟向服务器请求数据
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
notifyObserver("服务器返回数据:"+message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void addObserver(IObserver observer) {
observers.add(observer);
}
@Override
public void removeObserver(IObserver observer) {
observers.remove(observer);
}
@Override
public void notifyObserver(String message) {
for (IObserver observer:observers){
observer.handleMessage(message);
}
}
}
观察者接口
public interface IObserver {
//主题对象通知
void handleMessage(String messsage);
}
观察者对象
public class Observer implements IObserver {
@Override
public void handleMessage(String messsage) {
//处理message
System.out.print("message:"+messsage);
}
}
客户端调用
//主题对象
Subject subject = new Subject();
//观察者,处理服务器返回
IObserver observer = new Observer();
//添加观察者
subject.addObserver(observer);
subject.request("请求数据");
//移除观察者
// subject.removeObserver(observer);