什么是觀察者模式?
對象之間的一對一或者一對多的依賴,當一個主題對象發(fā)生改變的時候,它的所有依賴者都會收到通知。
直接看這個定義可能看了也是有點不明白什么是觀察者模式,那我們用幾個生活中的例子來說明下:
大家手機上都用過視頻軟件吧?當大家有喜歡的電視劇追的時候是不是又一個功能叫訂閱?這個其實就是一種觀察著模式,當用戶點擊訂閱按鈕時就相當于和這個電視劇產(chǎn)生了依賴關(guān)系,每當電視有更新的時候就會發(fā)通知給你告訴你有新的你就會去看。而像這樣的例子生活中有很多,就不一一列舉了。二java作為一門面相對象語言,所以很多地方用到了觀察者模式,例如android系統(tǒng)本身的廣播機制就采用了這種模式,還有如消息的推送也是采用的觀察者模式。
那觀察著模式具實現(xiàn)方式是怎么樣的?接下來我們看看觀察者模式的類圖
Subject : 主題對象的接口,定義了注冊,接觸注冊以及通知等方法
ProgramConcreteSubject :具體的主題對象,所有的觀察者對象都在這里被維護,當其本身發(fā)生變化時會通知所有觀察者
Observer:觀察者接口 ,定義了一個接受主題對象狀態(tài)變化的接口
PersonObserver:具體觀察者對象,維護一個對ProgramConcreteSubject的引用,實現(xiàn)Observer接口,通過update()方法接收主題對象的通知。
所以通過上面的介紹幾本了解了其結(jié)構(gòu),接下來看下具體的代碼:
Subject
package demo.arvin.com.androiddemo.observer;
/**
* Created by arvin on 16/7/23.
*/
public interface Subject {
void notifyAllPerson();
void registerObServer(Observer observe);
void unRegisterObServer(Observer observe);
}
ProgramConcreteSubject
package demo.arvin.com.androiddemo.observer;
import java.util.ArrayList;
/**
* Created by arvin on 16/7/23.
*/
public class ProgramConcreteSubject implements Subject {
ArrayList<Observer> observerArrayList = new ArrayList<Observer>();
String name ="";
@Override
public void notifyAllPerson() {
for(Observer observer:observerArrayList){
observer.updateNewProgrm(name);
}
}
@Override
public void registerObServer(Observer observer) {
if(observer != null){
observerArrayList.add(observer);
}
}
@Override
public void unRegisterObServer(Observer observer) {
if(observer != null){
observerArrayList.remove(observer);
}
}
public void newProgramName(String name){
this.name = name;
notifyAllPerson();
}
}
Observer
public interface Observer {
void updateNewProgrm(String name);
}
PersonObserver
package demo.arvin.com.androiddemo.observer;
/**
* Created by arvin on 16/7/23.
*/
public class PersonObserver implements Observer {
@Override
public void updateNewProgrm(String name) {
System.out.println("有新的節(jié)目:"+name);
}
}
調(diào)用
public static void main(String[] args) {
ProgramConcreteSubject subject = new ProgramConcreteSubject();
PersonObserver observer1 = new PersonObserver();
PersonObserver observer2 = new PersonObserver();
subject.registerObServer(observer1);
subject.registerObServer(observer2);
subject.newProgramName("CCTV");
}
面就是觀察者模式的具體用法,其實不難,但是在實際過程中我們需要判斷什么時候需要使用它,主要是當項目中某個對象狀態(tài)改變而其它某些對象不要根據(jù)這個狀態(tài)做相應的工作就可以用這個模式,那為什么不用其它模式了,其實最大的優(yōu)點在于,現(xiàn)在的項目由于功能越來越多,很多項目的業(yè)務邏輯綁定太緊,造成項目的維護成本高,擴展性不強,而觀察模式Subject和Observer之間是松偶合的,分別可以各自獨立改變,是項目更容易擴展。