一、首先要理解观察者模式
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");
}
}
原文:http://9437752.blog.51cto.com/9427752/1606449