import java.util.ArrayList;
/**
* 观察者模式test
* GG观察MM
* @author zhuchen
*
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
MM mm = new MM();
//在MM里 注册个观察者
mm.registerObserver(new DataSetObserver() {
@Override
public void onChange() {
super.onChange();
System.out.println("GG know MM's seek help 1!");
}
});
//MM发出数据,数据模型发生变化
mm.sendHelp("help me!");
}
}
/**
* 抽象类
* @author zhuchen
*
*/
abstract class DataSetObserver {
public void onChange() {
};
}
/**
* MM 被观察者
* @author zhuchen
*
*/
class MM {
GG gg = new GG();
public void registerObserver(DataSetObserver dataSetObserver) {
gg.registerObserver(dataSetObserver);
}
public void unRegisterObserver(DataSetObserver dataSetObserver) {
gg.unRegisterObserver(dataSetObserver);
}
public void sendHelp(String content) {
System.out.println("MM say: " + content);
gg.notifyDataSetChange();
}
/**
* 观察者
* @author zhuchen
*
*/
class GG extends DataSetObserverable {
public void notifyDataSetChange() {
super.notifyDataChange();
}
}
}
/**
* 定制的观察者 提供唤醒调用所有的观察者回调方法
* @author zhuchen
*
*/
class DataSetObserverable extends Observable<DataSetObserver> {
public void notifyDataChange() {
synchronized (mObservers) {
for (DataSetObserver observer : mObservers) {
observer.onChange();
}
}
}
}
/**
* 抽象类 提供观察者集合存放
* @author zhuchen
*
* @param <T>
*/
abstract class Observable<T> {
protected final ArrayList<T> mObservers = new ArrayList<T>();
public void registerObserver(T observer) {
if (observer == null) {
throw new RuntimeException("current observer is not null");
}
if (mObservers.indexOf(observer) != -1) {
throw new RuntimeException("current observer:" + observer
+ " is already exist!");
}
mObservers.add(observer);
System.out.println("GG observe MM!");
}
public void unRegisterObserver(T observer) {
if (observer == null) {
throw new RuntimeException("current observer is not null");
}
int index = mObservers.indexOf(observer);
if (index != -1) {
mObservers.remove(index);
}
}
}