Android觀察者模式初探

前提

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

話不多說先看圖

觀察者模式.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)用觀察者模式的地方很多)來看正文。_

釋義

觀察者模式

  定義對(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ì)象是誰 

參與者:

  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í)例

說了那么多的名詞解釋跌前,估計(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)系作者
  • 序言:七十年代末颅眶,一起剝皮案震驚了整個(gè)濱河市蜈出,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涛酗,老刑警劉巖铡原,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異商叹,居然都是意外死亡燕刻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門剖笙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卵洗,“玉大人,你說我怎么就攤上這事弥咪」澹” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵酪夷,是天一觀的道長(zhǎng)榴啸。 經(jīng)常有香客問我,道長(zhǎng)晚岭,這世上最難降的妖魔是什么鸥印? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任勋功,我火速辦了婚禮,結(jié)果婚禮上库说,老公的妹妹穿的比我還像新娘狂鞋。我一直安慰自己,他們只是感情好潜的,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布骚揍。 她就那樣靜靜地躺著,像睡著了一般啰挪。 火紅的嫁衣襯著肌膚如雪信不。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天亡呵,我揣著相機(jī)與錄音抽活,去河邊找鬼。 笑死锰什,一個(gè)胖子當(dāng)著我的面吹牛下硕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汁胆,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼梭姓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嫩码?” 一聲冷哼從身側(cè)響起誉尖,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铸题,沒想到半個(gè)月后释牺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡回挽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猩谊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片千劈。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖牌捷,靈堂內(nèi)的尸體忽然破棺而出墙牌,到底是詐尸還是另有隱情,我是刑警寧澤暗甥,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布喜滨,位于F島的核電站,受9級(jí)特大地震影響撤防,放射性物質(zhì)發(fā)生泄漏虽风。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辜膝。 院中可真熱鬧无牵,春花似錦、人聲如沸厂抖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忱辅。三九已至七蜘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墙懂,已是汗流浹背橡卤。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垒在,地道東北人蒜魄。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像场躯,于是被迫代替她去往敵國(guó)和親谈为。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容