一、首先要理解观察者模式
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");
}
}