設計模式(3)觀察者模式(講解+應用)

  1. 觀察者模式數據庫

  2. 爲何使用觀察者模式?函數

  3. 觀察者模式應用實例設計

觀察者模式

觀察者模式:又被稱爲訂閱者模式,經過一個對象管理相依於它的多對象,同時當該對象的狀態改變的時候會主動通知依賴於它的對象。經常使用在咱們後臺數據的變化對於前臺view的更新上。code

優勢:讓主題和依賴主題的觀察者之間鬆耦合,實現邏輯層和表示層的分離orm

爲何使用觀察者模式?

繼續上一個遊戲的設計,對於每個遊戲角色都會有一個藍條表明其魔法,在釋放技能的時候就會消耗,同時有一個紅條表明血量,當被攻擊的時候,紅條就會減小,當英雄被玩家操控,進行打鬥的時候,紅條和藍條就會隨着打鬥的進行,要求的不斷的變化,這樣給與用戶更好的體驗,用戶能夠根據實時的情況選擇合適的操做,逃或者是繼續打鬥,同時對於英雄的其餘一些信息,仍是須要在屏幕的其它地方進行顯示,這個時候就須要咱們可以實時的獲取這些信息,咱們可能首先會想到,採用輪詢的機制,去主動獲取數據庫或者其它存儲區域的數據。
可是咱們的開發中是不會使用這種方式的,首先輪詢是相對比較消耗的,再就是對於每一個英雄都要單獨寫代碼來獲取信息,若是咱們要對其進行修改,這個時候,咱們須要將其打開,而後對其修改,勢必增長了咱們犯錯的機會,獲取具體數據的代碼和咱們要展現數據的代碼都混在了一塊兒,這個時候,咱們就須要使用觀察者模式,來將咱們的View層和數據的獲取分出來,使用觀察者模式,咱們經過一個類用來做爲數據管理類,而後定義一個接口各個view實現這個接口,經過接口來和數據管理類進行交互,同時能夠實現,數據變化後更新,view層被動獲取數據,而不須要主動去抓數據。下面經過代碼演示一下。server

public interface Data{
//註冊數據監聽者
    public void registerObserver(Observer o);
//移除數據監聽者
    public void removeObserver(Observer o);
//數據更新後通知監聽者
    public void notifyObservers();
//更新數據
    public void dataChanged();
}
//監聽者類
public interface Observer{
//更新監聽者的數據
    public void updata(int blood,int energy);
//展現數據
    public void display();
}

上面的代碼大體爲觀察者模式的結構,對於後臺的數據,咱們設置一個變化管理類,若是須要訪問個人數據,那麼就須要經過接口的形式,經過調用註冊函數,將依賴實例注入到數據對象,而後,當咱們的數據類的對象變化後,咱們調用通知方法,而後通知方法中函數因此依賴對象的隊列,這樣當咱們的數據變化以後,各個組件就能夠被動的得到最新的更新數據。對象

觀察者應用實例

觀察者應用實例,View中觀察者模式使用的比較多,對於咱們所可以看到的控件和對於控件的監聽事件,咱們一般使用的就是這種觀察者模式,當咱們爲控件設置一個監聽者,當咱們的控件被觸發以後,監聽者就會被主動觸發,來執行相應的操做。例如Button。繼承

public class MyActivity extends Activity {
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);

         setContentView(R.layout.content_layout_id);

         final Button button = (Button) findViewById(R.id.button_id);
         button.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 // Perform action on click
             }
         });
     }
 }

此處的button能夠看作是咱們的主題,此處監聽者經過匿名內部類的形式,經過setOnClickListenter的形式注入進去,這個時候,當button有點擊事件,監聽者就會被通知,就會主動調用監聽者的ocClick方法,因爲Button繼承自TextView,TextView又繼承自View,View中具備監聽者隊列,當有事件被觸發,隊列中的監聽者就會被動觸發。
具體的View源代碼,和觸發代碼,此處再也不繼續演示,主要是藉助這個例子來幫助咱們進一步的理解觀察者模式的實際價值和用途。接口

後一篇,將講解單例模式。隊列

相關文章
相關標籤/搜索