首先告訴自己,這個模式很好理解。
事實上,確實是。
作用:當一個對象發生變化,需要其他對象也發生變化。
先看目錄
BeWatched:被觀察者類
Watcher:觀察者類
test:測試類
ITerface:存放接口。(名字貌似起錯了)
接口暫且不管。
Watcher.java
public class Watcher implements watcher.ITERFACE.IWatcher {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void iGotABaby(){
System.out.println("im "+name+" it told me sth~");
}
}
屬性 name,getter和setter方法。
有一個iGotABabt 方法。這是被觀察者發生變化時,觀察者要執行的方法。
BeWatched.java
public class BeWatched implements watcher.ITERFACE.IBeWatched {
private ArrayList<Watcher> a = new ArrayList<Watcher>();
@Override
public void add(Watcher w){
if(!a.contains(w))
a.add(w);
}
@Override
public void notifySth(){
for( Watcher w : a ){
w.iGotABaby();
}
}
}
注意,這個模式的精髓就在於:觀察者實例對象,要存放在被觀察者實例對象裏的私有arraylist裏面。
此時,我們只需要再寫一個遍歷一下這個私有arraylist就ok了。
test.java
public class test {
public static void main(String[] args) {
BeWatched b = new BeWatched();
Watcher w1 = new Watcher();
Watcher w2 = new Watcher();
Watcher w3 = new Watcher();
w1.setName("w1");
w2.setName("w2");
w3.setName("w3");
b.add(w1);
b.add(w2);
b.add(w3);
b.notifySth();
}
}
實例化一個被觀察者,然後實例化3個觀察者,這三個觀察者的name分別叫 w1,w2,w3。
然後將這三個觀察者存入被觀察者的arraylist裏面,
當被觀察者執行(發生變化)notifySth方法的時候,遍歷每一個觀察者,執行iGotABaby方法。
結果如下:
im w1 it told me sth~
im w2 it told me sth~
im w3 it told me sth~
至於接口,從這兩個類裏面提取出來即可。
建議學習設計模式的時候,先思考這個模式的應用場景,寫出具體的類,最後提取接口。不然容易本末倒置。
這是比較簡單的觀察者模式,如果出現觀察者聯動呢?
可以在這個被觀察者上,再加一層被觀察者。即a->b->c這種。
設計無窮,思維要活。
不知道爲什麼,之前發了好幾篇關於設計模式的學習心得,只有單例模式發出了。其他的,不見了。