天天看點

Android觀察者模式初探前提釋義執行個體感謝

前提

好久都沒更新了,最近因為看設計模式,因為首先看的是觀察者模式。對觀察者模式有了一個比較全面的了解。今天鬥膽來說一下自己的了解,還望各位看官老爺輕點打臉。
           

話不多說先看圖

Android觀察者模式初探前提釋義執行個體感謝

觀察者模式.png

_ 容小可解釋一下,在這個界面中,要實作在一個輸入框中寫入文本然後點選設定按鈕,實作下面的TextView實時改變的功能。到這裡也許有人會問了可以用TextWatcher實作啊,對的,因為TextWatcher中運用的就是觀察者模式(其實Android中運用觀察者模式的地方很多)來看正文。_

釋義

觀察者模式

定義對象間的一種一個(Subject)對多(Observer)的依賴關系,當一個對象的狀态發生改變時,所有依賴于它的 對象都得到通知并被自動更新 。
           

适用性:

1. 當一個抽象模型有兩個方面,其中一個方面依賴于另一方面 将這兩者封裝成獨立的對象中以使它們可以各自獨立的改變和服用 。
  2. 當對一個對象的改變需要同時改變其他對象,而不知道具體有多少對象有待改變 。
  3. 當一個對象必須通知其它對象,而它又不能假定其它對象是誰 
           

參與者:

1. Subject(目标) 
     目标知道它的觀察者,可以有任意多個觀察者觀察同一個目标提供注冊和删除觀察者對象的接口 
  2. Observer(觀察者) 
     為那些在目标發生改變時需獲得通知的對象定義個更新的接口 
  3. ConcreteSubject(具體目标) 
     将有關狀态存入各ConcreteObserver對象 當它的狀态發送改變時,向它的各個觀察者發出通知 
  4. ConcreteObserver(具體觀察者) 
維護一個指向ConcreteObserver對象的引用存儲有關狀态,這些狀态應與目标的狀态保持一緻 實作Observer的更新接口是自身狀态與目标的狀态保持一緻 
           

執行個體

說了那麼多的名詞解釋,估計各位看官都有點蒙圈了,别着急,讓本人用一個執行個體給你們示範一番,相信聰明的你們一定會看懂的。
           

1、首先是觀察者Observer

public class MyObserver implements Observer {

private Handler mHandler;
private String name;
public MyObserver() {
}

public MyObserver(Handler handler, String name) {
    this.mHandler = handler;
    this.name = name;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public void update(Observable observable, Object data) {
    sendMessage(MsgBox.MSG_UPDATE_SUCCESS, data);
}
   /**
    *發送消息
    */
private void sendMessage(int what, Object object) {
    Message msg = new Message();
    msg.what = what;
    msg.obj = object;
    mHandler.sendMessage(msg);
}
}
           

2、被觀察者Observable

/**
 * 被觀察者
 * 
 * @author Silence
 * 
 */
public class MyObserable extends Observable {

public void postNewPublication(String content) {
    setChanged();
    notifyObservers(content);
}
}
           

3、在Activity中使用

public class SecondActivity extends BaseActivity {
// 觀察者
private Button mBtnGet, mBtnSetting;
private TextView mTxtName;
private EditText mEdtContent;
// 觀察者
private MyObserver mObserver;
// 被觀察者
MyObserable obserable = new MyObserable();

@Override
protected void setContentView() {
    setContentView(R.layout.activity_second);
}

@Override
protected void initView() {
    mBtnGet = $(R.id.btn_get);
    mBtnSetting = $(R.id.btn_setting);
    mTxtName = $(R.id.txt_name);
    mEdtContent = $(R.id.edt_content);

}

@Override
protected void initData() {

}

@Override
protected void setListener() {
    mBtnGet.setOnClickListener(this);
    mBtnSetting.setOnClickListener(this);
}

@Override
protected void initLitener(View view) {
    switch (view.getId()) {
    case R.id.btn_get: {
        getData();
    }

        break;
    case R.id.btn_setting: {
        setData();
    }

        break;

    default:
        break;
    }
}

/**
 * 設定資料
 */
protected void setData() {
    String content = mEdtContent.getText().toString().trim();
    mObserver = new MyObserver(mHandler, content);
    obserable.addObserver(mObserver);
    obserable.postNewPublication(content);
}

/**
 * 擷取資料
 */
protected void getData() {

    startActivity(new Intent(SecondActivity.this, ThirdActivity.class));
}

/**
 * Handler
 */
Handler mHandler = new Handler() {
    @Override
    public void handleMessage(android.os.Message msg) {
        switch (msg.what) {
        case MsgBox.MSG_UPDATE_SUCCESS:
            String name = (String) msg.obj;
            mTxtName.setText(name);
            break;

        default:
            break;
        }
    };
};

@Override
protected void onDestroy() {
    super.onDestroy();
    obserable.deleteObserver(mObserver);
}

}
           

感謝

Android設計模式之觀察者模式 Android設計模式(十一)-觀察者模式

繼續閱讀