定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则全部依赖于它的对象都会获得通知并被自动更新。设计模式
public class MyObserver implements Observer{
private String mName;
public MyObserver(String name) {
mName = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println(mName + "-->" + "update: " + arg);
}
}
复制代码
public class MyObservable extends Observable{
public void sendChangeMeg(String content) {
//方法继承自Observable,标示状态或是内容发生改变
setChanged();
//方法继承自Observable,通知全部观察者,最后会调用每一个Observer的update方法
notifyObservers(content);
}
}
复制代码
public class ObserverPatternTest {
@Test
public void test1() throws Exception {
MyObservable myObservable = new MyObservable();
MyObserver myObserver1 = new MyObserver("observer-1");
MyObserver myObserver2 = new MyObserver("observer-2");
myObservable.addObserver(myObserver1);
myObservable.addObserver(myObserver2);
//发布消息
myObservable.sendChangeMeg("发布更新啦");
}
}
复制代码
public class Observable {
private boolean changed = false;
private final ArrayList<Observer> observers;
/** Construct an Observable with zero Observers. */
public Observable() {
observers = new ArrayList<>();
}
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!observers.contains(o)) {
observers.add(o);
}
}
public synchronized void deleteObserver(Observer o) {
observers.remove(o);
}
public void notifyObservers() {
notifyObservers(null);
}
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Observer[] arrLocal;
synchronized (this) {
if (!hasChanged())
return;
arrLocal = observers.toArray(new Observer[observers.size()]);
clearChanged();
}
//注意这里的起始点
for (int i = arrLocal.length-1; i>=0; i--)
arrLocal[i].update(this, arg);
}
public synchronized void deleteObservers() {
observers.clear();
}
protected synchronized void setChanged() {
changed = true;
}
protected synchronized void clearChanged() {
changed = false;
}
public synchronized boolean hasChanged() {
return changed;
}
public synchronized int countObservers() {
return observers.size();
}
}
复制代码
public interface Observer {
void update(Observable o, Object arg);
}
复制代码
欢迎关注个人微信公众号,期待与你一块儿学习,一块儿交流,一块儿成长! bash