观察者设计模式里面主要有两大元素:
观察者和通知者。可能为了扩展还会有观察者的抽象类或者接口。
通知者,保有观察者的引用,里面一般会实现注册观察者和注销观察者的方法,还会有一些notify方法,这些方法里面就会调用观察者的自己实现方法;
观察者,实现自己的接口或者父类就行了。
因为通知者,保有观察者的引用。所以,观察者的对象本身不能改变否则会出现通知不到的情况。
直接上代码:
public interface Observer<T> {
public void onStateChanged(T info);
public void onProgressed(T info);
}
public class Notify<T> {
private List<Observer> mObservers = new LinkedList<Observer>();
public void registerObserver(Observer observer){
synchronized (mObservers) {
if(!mObservers.contains(observer)){
mObservers.add(observer);
}
}
}
public void unRegisterObserver(Observer observer){
synchronized (mObservers) {
if(mObservers.contains(observer)){
mObservers.remove(observer);
}
}
}
public void notifyStateChanged(T info){
synchronized (mObservers) {
for (Observer observer:mObservers) {
observer.onStateChanged(info);
}
}
}
public void notifyProgressed(T info){
synchronized (mObservers) {
for (Observer observer:mObservers) {
observer.onProgressed(info);
}
}
}
}
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Notify<Integer> notify = new Notify<>();
Observer<Integer> observer1 = new Observer<Integer>() {
@Override
public void onStateChanged(Integer info) {
System.out.println("observer1:onStateChanged:" + info);
}
@Override
public void onProgressed(Integer info) {
System.out.println("observer1:onProgressed:" + info);
}
};
Observer<Integer> observer2 = new Observer<Integer>() {
@Override
public void onStateChanged(Integer info) {
System.out.println("observer2:onStateChanged:" + info);
}
@Override
public void onProgressed(Integer info) {
System.out.println("observer2:onProgressed:" + info);
}
};
notify.registerObserver(observer1);
notify.registerObserver(observer2);
for (int i = 0; i < 10; i++) {
notify.notifyProgressed(i);
}
}
}