什么是观察者模式
观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 举个例子:传播点正能量,就拿里约奥运会来说吧。奥运会比赛就是被观察者,看奥运的人,我们大家就是观察者,在奥运会中国某个比赛赢了的时候,我们这些观察者就会做出一些反应,发微博啊,发朋友圈啊,这就是一对多的观察者模式的理解
观察者模式编写
回调
这里先写个回调,感觉这样对下面观察者模式的编写会好理解一些。
public class DemoCallBack {
public interface CallbackListener {
public void setCallback(String str);
}
public void setOnListener(CallbackListener callback){
callback.setCallback(
"回调");
}
}
回调:
DemoCallBack callback=
new DemoCallBack();
callback.setOnListener(
new DemoCallBack.CallbackListener() {
public void setCallback(String str) {
System.
out.println(str);
}
});
观察者模式编写
观察者模式有的编写分为4部分:2个抽象(抽象观察者+抽象被观察者)2个具体(具体观察者+具体被观察者) 抽象观察者:还是考虑上面奥运会的例子,观察者在看奥运之后只需要做出一些反应,所以抽象观察者里面是一些可以回调的抽象方法比如update(更新状态)。 抽象被观察者:看奥运会的人不止一个,也就是观察者不止一个,被观察者只有在知道有哪些观察者的情况下才能通知到这些观察者,因此在抽象被观察者这个类中至少需要有三个抽象方法:register(注册观察者),unregister(注销观察者),notify(通知所有观察者)。 具体观察者:看了奥运会我们都会有不同的反应,这里的反应就是我们状态的更新。 具体被观察者:具体的被观察者需要对register(注册观察者),unregister(注销观察者),notify(通知所有观察者)这三个方法进行具体的实现比如添加观察者,注销观察者之类的。
抽象观察者
public interface Observer {
public void update(String str);
}
抽象观察者
public interface Observered {
public void register(Observer observer);
public void notify(String str);
public void unregister(Observer observer);
}
具体观察者
public class ConcreteObserver implements Observer {
public void update(String str) {
System.out.println(str);
}
}
具体被观察者
public class ConcreteObservered implements Observered{
private List<Observer> observers=
new ArrayList<Observer>();
public void register(Observer observer) {
observers.add( observer);
}
public void notify(String str) {
for(
int i=
0;i<observers.size();i++){
observers.get(i).update(str+
"ConcreteObserver"+i);
}
}
public void unregister(Observer observer) {
observers.remove(observer);
}
}
调用
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
Observer obs1=
new ConcreteObserver();
Observer obs2=
new ConcreteObserver();
Observer obs3=
new ConcreteObserver();
ConcreteObservered observered=
new ConcreteObservered();
observered.register(obs1);
observered.register(obs2);
observered.register(obs3);
observered.notify(
"通知所有观察者");
}
补充
在Android开发中观察者模式使用最明显的就是adapter中调用notifyDatasetchange或者是notify……的时候。还有RxAndroid也是观察者模式
转载请注明原文地址: https://ju.6miu.com/read-1312178.html