Rx_java(1) 觀察者模式例項講解
相關文章
寫在前面
通常我們的程式碼設計思想都是來源於生活,如面向物件的設計思想,觀察者模式等均來源現實生活。在我們正常接觸到的程式碼中,回撥介面、回撥函式、回撥引數、監聽器模式,這些也是觀察者模式。
觀察者模式(Observer)將觀察者和被觀察的物件分離開。拿觀察者模式呢舉個例子,我們介面是一個觀察者,而介面上面顯示的資料是被觀察者,如果我們的資料一旦發生變化,我們的介面馬上把這些變化後的資料顯示出來。
面向物件設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個物件只做一件事情,並且將他做好。觀察者模式在模組之間劃定了清晰的界限,提高了應用程式的可維護性和重用性。
觀察者設計模式定義了物件間的一種一對多的組合關係,以便一個物件的狀態發生變化時,所有依賴於它的物件都得到通知並自動重新整理。 —百度百科
觀察著模式的程式碼體現
首先,我們建立一個觀察者的介面Watcher
在裡面建立一個方法update(String str),當被觀察者的資料發生變化後,回撥此方法,所以,這個方法中需要完成當被觀察者資料變化後的業務邏輯。
/**
* description:
* author: dujun
* created at: 2017/12/28 17:31
* update: 2017/12/28
* version:
*/
public interface Watcher {
void update(String str); // 當被觀察者資料發生變化後,回撥此方法
}
然後,我們建立被觀察者的介面Watched
在裡面建立三個抽象方法 ,其實現類將實現此三個抽象方法的業務邏輯
1.void addWatcher(Watcher watcher); 此方法是給次被觀察者新增觀察者
2.void removeWatcher(Watcher watcher);此方法是移除新增進來的觀察者
3.void notifyWaters(String str);此方法是通知被新增進來的所有觀察者資料發生了變化
/**
* description:
* author: dujun
* created at: 2017/12/29 9:21
* update: 2017/12/29
* version:
*/
public interface Watched {
// 新增觀察者
void addWatcher(Watcher watcher);
// 移除觀察者
void removeWatcher(Watcher watcher);
// 通知被新增進來的所有觀察者資料發生了變化
void notifyWaters(String str);
}
然後我們來完成被觀察者實現類WatcheredImpl
在被觀察者裡面建立一個List集合,來儲存被新增進來的觀察者Watcher.
在notifyWaters()方法中,回撥所有觀察者update方法,來通知觀察著資料發生了變花變化。
/**
* description:
* author: dujun
* created at: 2017/12/29 9:33
* update: 2017/12/29
* version:
*/
public class WatcheredImpl implements Watched {
private List<Watcher> list = new ArrayList<>();
@Override
public void addWatcher(Watcher watcher) {
list.add(watcher);
}
@Override
public void removeWatcher(Watcher watcher) {
list.remove(watcher);
}
@Override
public void notifyWaters(String str) {
for (Watcher watcher : list) {
watcher.update(str);
}
}
}
接著來完成觀察者實現類WatcherImpl
實現 update(String str)方法,在此方法中完成被觀察者資料變化後的業務邏輯,
此處,我的邏輯很簡單,就是當被觀察者資料發生變化後,在控制檯輸出一個字串。
/**
* description:
* author: dujun
* created at: 2017/12/29 9:38
* update: 2017/12/29
* version:
*/
public class WatcherImpl implements Watcher {
@Override
public void update(String str) {
// 在此完成被觀察者資料變化後的業務邏輯
System.out.println(str);
}
}
最後我們來測試的我們上面完成的觀察者模式
編寫測試類Test,測試類中,所有步驟的註釋都寫的很詳細了,我這裡就不再囉嗦。
/**
* description:
* author: dujun
* created at: 2017/12/29 9:41
* update: 2017/12/29
* version:
*/
public class Test {
public static void main(String [] args) throws Exception{
// 建立一個被觀察者
WatcheredImpl watchered = new WatcheredImpl();
// 建立三個觀察者的例項物件
WatcherImpl watcher1 = new WatcherImpl();
WatcherImpl watcher2 = new WatcherImpl();
WatcherImpl watcher3 = new WatcherImpl();
// 將三個觀察者新增到被觀察者中
watchered.addWatcher(watcher1);
watchered.addWatcher(watcher2);
watchered.addWatcher(watcher3);
// 被觀察者資料發生變化,通知觀察者
watchered.notifyWaters("被觀察者資料發生了變化");
}
}
結果展示
執行測試類Test,
三個觀察著都接受到了觀察者資料的變化,並作出了響應。