观察者
观察者的作用主要是用于 观察 被观察者 ,被观察者改变数据通知 观察者 那么观察者 数值改变
被观察者
被观察者 数据源 被观察者数据改变 通知观察者
观察者模式的主要作用
主要是用于 传递数据 比如 rxjava Eventbug 有用到观察者的 地方 比如 服务器请求数据之后 数据 根据 observiced 发送到 observice 由 被观察者传递给 观察者 数据返回到 ui
小编 写这个主要是因为 在继承百度地图的时候 有这样一个问题 继承百度 地图定位功能的时候 需要写一个 public class MyLocationListener extends BDAbstractLocationListener {} 这样一个 内部类 但是非静态内部类的话 容易造成 内存问题 所以 我把他们分开写了 这样就会导致传递数据 会很麻烦 后开我觉得 观察者 模式 跟 被观察者 用于 ui 跟 class 很方便 或者 class 跟class 之间 但是 使用rxjava 或者eventbus 三方框架 有些麻烦 毕竟目前 就这一个地方 用到了 所以 自己 就干脆 写了个简单的 被观察者 代码如下
##首先 写好 被观察者 跟 观察者的 接口 了解一下 自己 需要通知 接口的 数据是什么
public interface MyObserved { //被观察者 接口
void addobservice(MyObserviceVo addobservice); //添加 观察者
void removeobservice(MyObserviceVo removeobservice); //移除观察者
void noticeobservice(Pserson noticeobservice); // 通知 观察者 我要改变什么数据 类型
}
public interface MyObservice { //观察者 接口
void upData(Pserson data); // 观察者接口 我接受什么类型数据
}
##接口完成之后 开始写 类
public class MyObservicedVo implements MyObserved { //被观察者 实现 被观察者接口
public ArrayList<MyObserviceVo> list = new ArrayList<>();
@Override
public void addobservice(MyObserviceVo addobservice) {
list.add(addobservice); //添加 观察者 因为观察者 观察被观察者
}
@Override
public void removeobservice(MyObserviceVo removeobservice) {
if (list.size() > 0) { //移除并且 置空
list.remove((removeobservice));
list = null;
}
}
@Override
public void noticeobservice(Pserson pserson) {
if (list.size() > 0) { //通知 所有观察者 改变的 数据
for (MyObservice nitice : list) {
nitice.upData(pserson);
}
}
}
}
public class MyObserviceVo implements MyObservice { //观察者 实现接口
@Override
public void upData(Pserson data) {
System.out.print("观察者接受 消息 :" + data.getName()+" \n");
}
}
通知的数据类型
public class Pserson {
public String name;
public Pserson() {
}
public Pserson(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
##最后 测试类 测试 被观察者数据改变 能否通知到 观察者
public class Test {
public static void main(String[] args) {
MyObservicedVo myObservicedVo = new MyObservicedVo(); //创建被观察者
myObservicedVo.addobservice(new MyObserviceVo()); //添加观察者
Pserson pserson = new Pserson();//创建 通知数据
new Thread(new Runnable() { //创建线程 循环 每隔两秒 通知观察者 通知数据类型改变 直到 a值>10 停止通知
int a = 1;
@Override
public void run() {
while (a <= 10) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
pserson.setName("我的名字叫--->" + a+"\n");
myObservicedVo.noticeobservice(pserson);
a++;
}
Thread.interrupted();
System.out.print(" " + "循环完成" + " ");
}
}).start();
}
}
因为这个是自己写的 简单被观察者 通知观察者 所以在Avtivity stop() 中 移除就行 最后结果
observiced