今天給大家帶來一個同樣比較簡單的設計模式,觀察者模式,首先我們來看一下定義:在對象之間定義了一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象會收到通知并自動更新。
根據這個定義,我們可以看出,主要分為兩個部分,第一個是觀察者,第二個是被觀察者。為一對多的關系,當被觀察者做出改變的時候,觀察者們可以觀察到這個變化。比較容易理解的例子就是我們的公眾號,公眾號就是被觀察者,用戶就是觀察者,當公眾號發表文章的時候,我們每個關注了的用戶都能立即收到。我們進行分析,公眾號主要有三個功能,分別為,關注、取消關注、推送消息。用戶只有在關注了之后,才能在公眾號做消息推送的時候進行接收。我們來書寫一下這個被觀察者的超類。
//被觀察者
public interface Observerable<T>{
//訂閱
public void subscribe(Observer<T> observer);
//取消訂閱
public void unSubscribe(Observer<T> observable);
//告知觀察者數據改變
public void notifyObserver(T t);
}
我們的用戶比較簡單提供一個方法來讓公眾號告知改變了什么數據。我們來書寫一下超類。
//觀察者
public interface Observer<T> {
public void updata(T data);
}
接下來我們來進行具體的實現
public class WeChatServer<T> implements Observerable<T> {
public List<Observer<T>> observers ;
public WeChatServer(){
observers = new ArrayList<>();
}
@Override
public void subscribe(Observer<T> observer) {
if(observer!= null && !observers.contains(observer)){
observers.add(observer);
}else if(observer == null){
throw new IllegalArgumentException("observer is null");
}
}
@Override
public void unSubscribe(Observer<T> Observer) {
if(!observers.isEmpty()){
observers.remove(Observer);
}
}
@Override
public void notifyObserver(T t) {
for(int i = 0; i < observers.size(); i++) {
Observer oserver = observers.get(i);
oserver.updata(t);
}
}
//設置數據
public void setData(T data){
notifyObserver(data);
}
}
被觀察者提供subscribe方法將觀察者放在一個統一的集合當中,主要目的就是在數據改變時,找到所有關注了的用戶,告知數據發生了改變。我們可以在notifyObserver方法中看到具體實現。setData方法提供的是改變公眾號內容的方法。我們再來實現一下用戶部分。
public class User implements Observer<String> {
private String name;
private int age;
public User(String name, int age){
this.name = name;
this.age = age ;
}
@Override
public void updata(String data) {
System.out.println("我是"+name+",我收到了消息data:="+data);
}
}
我們實現updata方法接收到公眾號的更新。并打印更新信息,我們來測試一下。
public static void main(String args[]){
WeChatServer<String> observerable = new WeChatServer<>();
Observer<String> observer1 = new User("張三",18);
Observer<String> observer2 = new User("李四",31);
Observer<String> observer3 = new User("王武",11);
Observer<String> observer4 = new User("玉剛",30);
observerable.subscribe(observer1);
observerable.subscribe(observer2);
observerable.subscribe(observer3);
observerable.subscribe(observer4);
observerable.setData("新聞1");
observerable.unSubscribe(observer2);
System.out.println("李四退訂");
observerable.setData("新聞2");
}
//結果
我是張三,我收到了消息data:=新聞1
我是李四,我收到了消息data:=新聞1
我是王武,我收到了消息data:=新聞1
我是玉剛,我收到了消息data:=新聞1
李四退訂
我是張三,我收到了消息data:=新聞2
我是王武,我收到了消息data:=新聞2
我是玉剛,我收到了消息data:=新聞2
我們可以看到 我們創建了4個用戶分別訂閱了公眾號。都能收到公眾號的新聞,當李四退訂之后,公眾號發的新聞就收不到了。完全符合對觀察者模式的定義:在對象之間定義了一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象會收到通知并自動更新。