一、首先要理解觀察者模式
1、設計思想: 定義對象間的一種一對多的依賴關係,當一個對象的狀態發送改變時,所有依賴於它的對象都得到通知並被自動更新(也可以選擇性的更新某個它所依賴的對象)。
2、觀察者模式中主要有觀察者和被觀察者2個對象
觀察者(Observer):爲那些在目標發生改變時需獲得通知的對象定義個更新的接口,觀察者可以有多個,實現了該接口的類都屬於觀察者
被觀察者(Observable):觀察者所關注的目標,可以有任意多個觀察者觀察同一個目標
二、代碼解釋
挺多人喜歡把MyOberable和MyOberver分開寫,個人喜歡寫在一起
public interface MyOberable {
/*
* 被觀察者
*/
public interface MyOberver {// 觀察者,需要用到觀察者模式的類需實現此接口
// 具體觀察者在得知被觀察者狀態改變時進行處理
public void update(int what,Object... objs);
//int what是用來選擇性的通知某個觀察這,去掉的話就是通知所有的觀察者
}
public void attachObserver(MyOberver oberver);//註冊觀察者
public void detachObserver(MyOberver oberver);//刪除觀察者
public void notfilyObserver(int what,Object... objs);//通知觀察者
//int what是用來選擇性的通知某個觀察這,去掉的話就是通知所有的觀察者
public void detachObservers();//刪除所有的觀察者
}
import java.util.ArrayList;
/**
* 具體被觀察者並實現其抽象接口抽象被觀察者
*
**/
public class MyConcreteOberable implements MyOberable {
// 定義一個List來封裝觀察者MyOberver
private ArrayList<MyOberver> oberverlist = new ArrayList<MyOberver>();
/**
* Attach Observer (註冊觀察者) oberver必須不爲空,不然會拋出NullPointerException
* */
@Override
public void attachObserver(MyOberver oberver) {
if (oberver == null)
throw new NullPointerException();
synchronized (oberverlist) {
if (!oberverlist.contains(oberver)) {
oberverlist.add(oberver);
}
}
}
/**
* Detach Observer (刪除觀察者)
* */
@Override
public synchronized void detachObserver(MyOberver oberver) {
oberverlist.remove(oberver);
}
/**
* 通知觀察者數據發生變化
* */
@Override
public void notfilyObserver(int what, Object... objs) {
if (oberverlist != null) {
for (MyOberver obser : oberverlist) {
obser.update(what, objs);
}
}
}
@Override
public void detachObservers() {
oberverlist.clear();
oberverlist = null;
}
}
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//實現一個被觀察者實例
MyConcreteOberable Oberable= new MyConcreteOberable();
//實例3個觀察者對被觀察者進行觀察
MyOberver1 Oberver1= new MyOberver1(); // MyOberver1實現了MyOberver
MyOberver2 Oberver2= new MyOberver2(); // MyOberver2實現了MyOberver
//加入對其觀察
Oberable.attachObserver(Oberver1);
Oberable.attachObserver(Oberver2);
//當被觀察者發生變化時調用其信息方法
Oberable.notfilyObserver(1,"1表示選擇通知Oberver1");
}
}