观察者模式一些角色:
抽象主题:抽象主题对象一般是一个抽象类,且里面包含最基础的添加观察者对象、移除观察者对象、通知观察者状态改变。
具体主题对象:针对主要是这个功能是用来干什么的,并实现上面抽象主题的基本的几个抽象方法。具体的操作试本次功能来定。
抽象观察者:抽象观察者一般是一个接口,且里面包含当被观察者的某一属性改变的时候去调用的方法。
具体的观察者:可以有多个,实现抽象观察者的方法。并实现自己的逻辑。
依次创建他们,来实现观察者模式 直接上代码:
抽象观察者:
package com.linzh.studyObserver;
public interface Observer<T> {
void changeMyself(T data);
}
抽象主题:
package com.linzh.studyObserver;
import java.util.ArrayList;
/**
* 主题
* @param <T>
*/
public abstract class Subject<T> {
private ArrayList<Observer<T>> arrayList = new ArrayList();
/**
* 订阅
* @param observer
*/
public void subscribe(Observer<T> observer){
arrayList.add(observer);
}
/**
* 取消订阅
* @param observer
*/
public void unSubscribe(Observer<T> observer){
arrayList.remove(observer);
}
public void notifyObserver(T data){
for (Observer observer:arrayList) {
observer.changeMyself(data);
}
}
}
具体主题:
package com.linzh.studyObserver;
public class ResponseSubject<T> extends Subject<T> {
public void toChangeData(T data){
notifyObserver(data);
}
}
具体观察者:
package com.linzh.studyObserver;
import android.util.Log;
public class RequestObserver<T> implements Observer<T>{
@Override
public void changeMyself(T data) {
Log.e("TAG","监听到了数据:"+data.toString());
}
}
下面我们就可以通过 具体的主题来通知具体的观察者去改变数据:
ResponseSubject<Study> stringResponseSubject = new ResponseSubject<>();
RequestObserver<Study> stringRequestObserver = new RequestObserver<>();
stringResponseSubject.subscribe(stringRequestObserver);
stringResponseSubject.toChangeData(new Study("小明","13333333333"));
创建一个具体主题 ResponseSubject 指定类型为Study 再创建具体观察者RequestObserver 必须与ResponseSubject 的类型一致, 当RequestObserver订阅了该主题之后 主题发生变化时 RequestObserver就能收到变化的消息