观察者模式
二话不说,上来就是定义
这个好像还好理解那么一点点,不过还是先来讲个情景,
天气预报的短信服务,一旦付费订阅,每次天气更新都会向你及时发送
其实就是我们无需每时每刻关注我们感兴趣的东西,我们只需要订阅它即可,一旦我们订阅的事务有变化了,被订阅的事务就会即时的通知我们
我们来看一下观察者模式的组成:
- <李>
观察者,我们称它为观察者,有时候我们也称它为订阅者,即用户
李> <李>被观察者,我们称它为可观测,即可以被观察的东西,有时候还会称之为主题,即主题
李>
公共接口ObjectAble {
公共空间添加(ObjectSerType类型,ObjectServer obj);//添加订阅
公共空间删除(ObjectSerType类型,ObjectServer obj);//取消订阅
空白notifyDataChange (ObjectSerType类型,对象……obj);//发送订阅内容
}
2,
公共接口ObjectServer {
空白> a, b, c, d
}
4,实现ObjectAble接口,为每个方法添加逻辑
包com.example.testobjectserver;
进口java.util.ArrayList;进口java.util.HashMap;
进口并不知道;
进口android.util.Log;
公共类ObjectAbleImpelet实现ObjectAble {
公共静态ArrayList
静态ObjectAbleImpelet实例=零;
公共静态ObjectAbleImpelet getInstance () {
同步(ObjectAbleImpelet.class) {
如果(实例==null)
=new ObjectAbleImpelet实例();}
返回实例;
};
@Override
公共空白添加(ObjectSerType类型,ObjectServer obj) {
如果(类型==零,,obj==null)
抛出NullPointerException新(“ObjectSerType或ObjectServer不能空”);
同步(ObjectServerList) {
HashMap
地图。把(类型、obj);
ObjectServerList.add(地图);
日志。e (“”、“ObjectServerList>在祝辞”+ ObjectServerList);
}
}
@Override
公共空删除(ObjectSerType类型,ObjectServer obj) {
(HashMap
日志。e (“”、“type>在祝辞”+类型),
如果(map.get(类型).equals (obj)) {
ObjectServerList.remove(地图);
日志。e (“”、“obj>在祝辞”+ obj);
打破;
}
}
}
@Override
公共空notifyDataChange (ObjectSerType类型,对象……obj) {
(int i=0;我& lt;ObjectServerList.size ();我+ +){
HashMap
如果(map.containsKey(类型)){
map.get(类型).onRecever (obj);
}
}
}
}
包com.example.testobjectserver;
进口android.app.Activity;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.Menu;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.TextView;
公共类MainActivity扩展活动实现ObjectServer {
@Override
保护空白> super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
ObjectAbleImpelet.getInstance阀门()(ObjectSerType。一个,这个);//添加订阅,类型为ObjectSerType。a类型由开发者定义
findViewById (R.id.button1)。setOnClickListener (new> @Override
公共空>//TODO自动生成方法存根
ObjectAbleImpelet.getInstance () .notifyDataChange (
ObjectSerType。,“你好");//主题发生变化,触,,,,,,//发所有类型为ObjectSerType.a的观察者调用onRecever方法
}
});}
@Override公共布尔>
//膨胀菜单;这将条目添加到操作栏如果礼物。
getMenuInflater () .inflate (R.menu。主菜单);
返回true;
}
,,,,,,,,//主题变化后,观察者的回调
@Override
公共空>日志。e(“”、“我是观察者! ! !”+(字符串)obj [0]);
((TextView) findViewById (R.id.textView1))。setText(" +(字符串)obj [0]);
}
@Override
保护空白> ObjectAbleImpelet.getInstance () .remove (ObjectSerType。一个,这个);
super.onDestroy ();
}
}