前提
好久都沒更新了撮奏,最近因?yàn)榭丛O(shè)計(jì)模式,因?yàn)槭紫瓤吹氖怯^察者模式惜论。對(duì)觀察者模式有了一個(gè)比較全面的理解塞琼。今天斗膽來說一下自己的理解凫海,還望各位看官老爺輕點(diǎn)打臉。
話不多說先看圖
_ 容小可解釋一下,在這個(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);
}
}