什么是觀察者模式灵嫌?
對象之間的一對一或者一對多的依賴沟娱,當一個主題對象發(fā)生改變的時候氛驮,它的所有依賴者都會收到通知。
直接看這個定義可能看了也是有點不明白什么是觀察者模式济似,那我們用幾個生活中的例子來說明下:
大家手機上都用過視頻軟件吧矫废?當大家有喜歡的電視劇追的時候是不是又一個功能叫訂閱?這個其實就是一種觀察著模式砰蠢,當用戶點擊訂閱按鈕時就相當于和這個電視劇產生了依賴關系蓖扑,每當電視有更新的時候就會發(fā)通知給你告訴你有新的你就會去看。而像這樣的例子生活中有很多台舱,就不一一列舉了律杠。二java作為一門面相對象語言,所以很多地方用到了觀察者模式竞惋,例如android系統(tǒng)本身的廣播機制就采用了這種模式柜去,還有如消息的推送也是采用的觀察者模式。
那觀察著模式具實現方式是怎么樣的拆宛?接下來我們看看觀察者模式的類圖
Subject : 主題對象的接口嗓奢,定義了注冊,接觸注冊以及通知等方法
ProgramConcreteSubject :具體的主題對象胰挑,所有的觀察者對象都在這里被維護蔓罚,當其本身發(fā)生變化時會通知所有觀察者
Observer:觀察者接口 ,定義了一個接受主題對象狀態(tài)變化的接口
PersonObserver:具體觀察者對象瞻颂,維護一個對ProgramConcreteSubject的引用豺谈,實現Observer接口,通過update()方法接收主題對象的通知贡这。
所以通過上面的介紹幾本了解了其結構茬末,接下來看下具體的代碼:
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);
}
}
調用
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)改變而其它某些對象不要根據這個狀態(tài)做相應的工作就可以用這個模式,那為什么不用其它模式了辈双,其實最大的優(yōu)點在于责掏,現在的項目由于功能越來越多,很多項目的業(yè)務邏輯綁定太緊湃望,造成項目的維護成本高换衬,擴展性不強痰驱,而觀察模式Subject和Observer之間是松偶合的,分別可以各自獨立改變瞳浦,是項目更容易擴展担映。