观察者模式(Observer Pattern)
观察者模式的目标大概是这样
当某个方法执行时去执行一系列的方法
不知道为什么,每当我看到这个模式时就想到按钮点击
public interface OnClickListener {
void onClick(Button view);
}
public class Button {
private Set<OnClickListener> mClickListeners = new HashSet<OnClickListener>();
private String mText;
public Button(String text) {
mText = text;
}
public void addOnClickListener(OnClickListener listener) {
mClickListeners.add(listener);
}
public void click() {
for (OnClickListener listener : mClickListeners) {
listener.onClick(this);
}
}
public String getText() {
return mText;
}
}
调用的时候是这样
Button btn = new Button("btn1");
btn.addOnClickListener(new OnClickListener() {
@Override
public void onClick(Button view) {
System.out.println(view.getText());
}
});
// 这个方法一般不会在这里调用
btn.click();
这样的话看起来很眼熟了,但…观察者呢?所以,要改名字。
// 这个是原来的 Button,是被观察的对象
public class Subject {
private Set<Observer> mObservers = new HashSet<Observer>();
private String mText;
public Subject(String text) {
mText = text;
}
public void registerObserver(Observer observer ) {
mObservers.add(observer);
}
public void notifyObservers() {
for (Observer observer : mObservers) {
observer.notify(this);
}
}
public String getText() {
return mText;
}
}
// 原来的 onclicklistener 是观察者
public interface Observer {
void notify(Subject view);
}
调用的时候并没有该多少
Subject btn = new Subject("btn1");
btn.registerObserver(new Observer() {
@Override
public void notify(Subject view) {
System.out.println(view.getText());
}
});
// 这个方法一般不会在这里调用
btn.notifyObservers();
这么一改就变得不那么眼熟了 - -
这个设计模式麻烦的地方应该在于通知的时机,反正是不可能刚添加完事件就去调用的,其它的使用方式,就像刚开始说的那样,适合于需要注册或者订阅,在某种条件下去调用观察者的某个方法。
The end.