1.概述

观察者模式最常用的地方是GUI系统、订阅-发布系统。观察者模式的一个重要作用就是解耦,将观察者和被观察者解耦,使得他们之间的依赖性更小。

2.定义

定义对象间的一种一对多依赖关系,使得每当一个对象改变状态时,所有依赖他的对象都会得到通知并自动更新。

3.简单的代码实现

观察者

public class MyObserver implements Observer {
public String name;
public MyObserver(String name){
this.name=name;
}
@Override
public void update(Observable observable, Object o) {
System.out.println("Hi,标记下哦"+name+"更新内容:"+o.toString());
}
@Override
public String toString() {
return "观察者姓名:"+name;
}
}

被观察者

public class MyObservable  extends Observable{
public void postNew(String content){
/**
* 标示状态或内容发生改变
*/
setChanged();
notifyObservers(content); }
}

实现

               MyObservable myObservable=new MyObservable();
MyObserver myObserver1=new MyObserver("观察者1");
MyObserver myObserver2=new MyObserver("观察者2");
myObservable.addObserver(myObserver1);
myObservable.addObserver(myObserver2);
myObservable.postNew("这里是更新的内容哦");

运行后会打印:

Hi,标记下哦观察者1更新内容:这里是更新的内容哦
Hi,标记下哦观察者2更新内容:这里是更新的内容哦

4.Observer Observable 

两则都是JDK的内置类型,在以上中Observer是抽象观察者角色,Obsevable是抽象主题,而MyObserver,是具体观察者,MyObservable是具体主题。 MyObserver订阅MyObservable主题后,当MyObservable更新时,会遍历所有的MyObserver,发生通知。在整个的通知系统中是通过Observer和Observable完成的,MyObserver和MyObservable完全没有耦合,保证了订阅的灵活性和可扩展性。

 5.EventBus简单使用 (EventBus 也是使用的订阅,观察者模式)

下载地址 https://github.com/greenrobot/EventBus

注册

  EventBus.getDefault().register(this);

解除注册

 protected void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);
}

接受事件 3.0需要加入

@Subscribe
方法名
onEventMainThread 可以自定义了。
  @Subscribe
public void onEventMainThread(ItemBean itemBean){ textView.setText(itemBean.msg);
Log.d("harvic", "onEventMainThread收到了消息:" + itemBean.getMsg()); }

发送事件

   EventBus.getDefault().post(new ItemBean("我的EventBus"));

 

最新文章

  1. Java 策略模式和状态模式
  2. sonarqube插件开发(一) 环境搭建
  3. 8-IO总结
  4. 驱动开发之 创建线程函数PsCreateSystemThread
  5. java web 代码
  6. webSocket浏览器握手不成功(解决)
  7. Linux下I/O多路转接之epoll(绝对经典)
  8. 高通msm8994性能及温度监测脚本
  9. 基本promise
  10. 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理
  11. Kindle2018 一周使用报告
  12. 占满屏幕的宽高,当把textarea换成其他标签的时候,怎么才能编辑?
  13. 大数据java基础day01
  14. Java生成8位随机邀请码,不重复
  15. 强大的CSS3动画库animate.css
  16. 深入理解java集合框架之---------Arraylist集合 -----添加方法
  17. Android开发 使用HBuilder的缓存方法
  18. python全栈开发-面向对象-初识2
  19. Machine Learning in Action-chapter2-k近邻算法
  20. iOS如何让主界面不显示NavigationBar

热门文章

  1. VHDL_LIB之DFF
  2. java函数式编程之lambda表达式
  3. 关于Java学习
  4. RabbitMQ学习之spring配置文件rabbit标签的使用
  5. vs code格式化代码快捷键
  6. 洛谷P1466 集合 Subset Sums_01背包水题
  7. Vue学习之路第十一篇:为页面元素设置class类样式
  8. FreeMarker 语法 访问 pojo 的属性
  9. poj 2955 区间dp入门题
  10. BA-Siemens-时间表