定義對象間的一種一對多的依賴關係,使得每當一個對象改變狀態,則全部依賴於它的對象都會獲得通知並被自動更新。設計模式
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