Android觀察者模式初探

前提

好久都沒更新了,最近因?yàn)榭丛O(shè)計(jì)模式,因?yàn)槭紫瓤吹氖怯^察者模式。對(duì)觀察者模式有了一個(gè)比較全面的理解。今天斗膽來(lái)說(shuō)一下自己的理解,還望各位看官老爺輕點(diǎn)打臉。

話不多說(shuō)先看圖

觀察者模式.png

_ 容小可解釋一下,在這個(gè)界面中,要實(shí)現(xiàn)在一個(gè)輸入框中寫入文本然后點(diǎn)擊設(shè)置按鈕,實(shí)現(xiàn)下面的TextView實(shí)時(shí)改變的功能。到這里也許有人會(huì)問了可以用TextWatcher實(shí)現(xiàn)啊,對(duì)的,因?yàn)門extWatcher中運(yùn)用的就是觀察者模式(其實(shí)Android中運(yùn)用觀察者模式的地方很多)來(lái)看正文。_

釋義

觀察者模式

  定義對(duì)象間的一種一個(gè)(Subject)對(duì)多(Observer)的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的 對(duì)象都得到通知并被自動(dòng)更新 。

適用性:

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

參與者:

  1. Subject(目標(biāo)) 
     目標(biāo)知道它的觀察者,可以有任意多個(gè)觀察者觀察同一個(gè)目標(biāo)提供注冊(cè)和刪除觀察者對(duì)象的接口 
  2. Observer(觀察者) 
     為那些在目標(biāo)發(fā)生改變時(shí)需獲得通知的對(duì)象定義個(gè)更新的接口 
  3. ConcreteSubject(具體目標(biāo)) 
     將有關(guān)狀態(tài)存入各ConcreteObserver對(duì)象 當(dāng)它的狀態(tài)發(fā)送改變時(shí),向它的各個(gè)觀察者發(fā)出通知 
  4. ConcreteObserver(具體觀察者) 
維護(hù)一個(gè)指向ConcreteObserver對(duì)象的引用存儲(chǔ)有關(guān)狀態(tài),這些狀態(tài)應(yīng)與目標(biāo)的狀態(tài)保持一致 實(shí)現(xiàn)Observer的更新接口是自身狀態(tài)與目標(biāo)的狀態(tài)保持一致 

實(shí)例

說(shuō)了那么多的名詞解釋,估計(jì)各位看官都有點(diǎn)蒙圈了,別著急,讓本人用一個(gè)實(shí)例給你們演示一番,相信聰明的你們一定會(huì)看懂的。

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);
}
   /**
    *發(fā)送消息
    */
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;
    }
}

/**
 * 設(shè)置數(shù)據(jù)
 */
protected void setData() {
    String content = mEdtContent.getText().toString().trim();
    mObserver = new MyObserver(mHandler, content);
    obserable.addObserver(mObserver);
    obserable.postNewPublication(content);
}

/**
 * 獲取數(shù)據(jù)
 */
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設(shè)計(jì)模式之觀察者模式
Android設(shè)計(jì)模式(十一)-觀察者模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容