Observer觀察者模式

一、首先要理解觀察者模式

  1、設計思想: 定義對象間的一種一對多的依賴關係,當一個對象的狀態發送改變時,所有依賴於它的對象都得到通知並被自動更新(也可以選擇性的更新某個它所依賴的對象)。

  2、觀察者模式中主要有觀察者和被觀察者2個對象

    觀察者(Observer):爲那些在目標發生改變時需獲得通知的對象定義個更新的接口,觀察者可以有多個,實現了該接口的類都屬於觀察者

    被觀察者(Observable):觀察者所關注的目標,可以有任意多個觀察者觀察同一個目標

 

二、代碼解釋

  挺多人喜歡把MyOberable和MyOberver分開寫,個人喜歡寫在一起

public interface MyOberable {
 /*
  * 被觀察者
  */
 public interface MyOberver {// 觀察者,需要用到觀察者模式的類需實現此接口
  // 具體觀察者在得知被觀察者狀態改變時進行處理
  public void update(int what,Object... objs);

   //int what是用來選擇性的通知某個觀察這,去掉的話就是通知所有的觀察者
 }

 public void attachObserver(MyOberver oberver);//註冊觀察者

 public void detachObserver(MyOberver oberver);//刪除觀察者

 public void notfilyObserver(int what,Object... objs);//通知觀察者

 //int what是用來選擇性的通知某個觀察這,去掉的話就是通知所有的觀察者

 public void detachObservers();//刪除所有的觀察者
}

 

import java.util.ArrayList;

/**
 * 具體被觀察者並實現其抽象接口抽象被觀察者
 *
 **/

public class MyConcreteOberable implements MyOberable {
 // 定義一個List來封裝觀察者MyOberver
 private ArrayList<MyOberver> oberverlist = new ArrayList<MyOberver>();

 /**
  * Attach Observer (註冊觀察者) oberver必須不爲空,不然會拋出NullPointerException
  * */
 @Override
 public void attachObserver(MyOberver oberver) {
  if (oberver == null)
   throw new NullPointerException();
  synchronized (oberverlist) {
   if (!oberverlist.contains(oberver)) {
    oberverlist.add(oberver);
   }
  }
 }

 /**
  * Detach Observer (刪除觀察者)
  * */
 @Override
 public synchronized void detachObserver(MyOberver oberver) {
  oberverlist.remove(oberver);
 }

 /**
  * 通知觀察者數據發生變化
  * */
 @Override
 public void notfilyObserver(int what, Object... objs) {
  if (oberverlist != null) {
   for (MyOberver obser : oberverlist) {
    obser.update(what, objs);
   }
  }
 }

 @Override
 public void detachObservers() {
  oberverlist.clear();
  oberverlist = null;
 }

}

 

import android.os.Bundle;  

import android.app.Activity;  

import android.view.Menu;  

  

public class MainActivity extends Activity {  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

          

        //實現一個被觀察者實例  

        MyConcreteOberable Oberable= new MyConcreteOberable();  

        //實例3個觀察者對被觀察者進行觀察  

        MyOberver1 Oberver1= new MyOberver1(); //  MyOberver1實現了MyOberver

        MyOberver2 Oberver2= new MyOberver2(); //  MyOberver2實現了MyOberver

        //加入對其觀察  

        Oberable.attachObserver(Oberver1);

        Oberable.attachObserver(Oberver2);

        //當被觀察者發生變化時調用其信息方法  

        Oberable.notfilyObserver(1,"1表示選擇通知Oberver1");

    }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章