前提
好久都沒更新了,最近因為看設計模式,因為首先看的是觀察者模式。對觀察者模式有了一個比較全面的理解。今天斗膽來說一下自己的理解,還望各位看官老爺輕點打臉。
話不多說先看圖
觀察者模式.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);
}
}