前言

最近刚开始学习RxJava,众所周知,Rxjava就是扩展的观察者模式,所以想学习Rxjava,先入手了解一下观察者模式是很有必要的。那么今天就先稍微了解一下什么是观察者模式。

定义

观察者(Observer)模式:是对象的行为模式,也叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Module/View)模式、源-监听(Source/Listener)模式或者从(Dependents)模式。

观察者模式定义了一对多的依赖关系,即让多个观察者对象同时监听同一个主题对象,当这个主题对象的状态发生改变时,要通知所有的观察者对象,使他们能够更新自己。

众大神博客里面最多的例子就是天气预报和小偷警察的例子。拿小偷和警察的例子来说,小偷就是被观察者,而警察就是观察者。多个警察在关注小偷的行为,当小偷想偷东西时,即主题对象状态发生改变时,这个时候很多警察就会上去抓住他,也就是观察者更新了自己的行为。

UML类图

Paste_Image.png

我们来解释一下UML图中的含义:

Subject

主题,即被观察者接口,它是一个抽象的接口,包含三个方发,attach()即增加订阅者,detach()删除订阅者,notifyObserver()通知订阅者;

Observer

观察者接口,它是一个抽象的接口,其中含有一个update()方发,用来在被观察者状态改变的时候进行更新自己。

ConcreteSubject

被观察者对象,实现了被观察者接口,同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。注意,该集合的泛型参数应该是Observer,接口类型,而不应该是具体的Observer实现类,这样做的原因是一个被观察者可能会有多个不同实现类的观察者(但都实现了Observer接口),如果限定了某一个具体的类型,那么会导致以后要加入新类型的时候而不得不修改当前类,耦合度过高,这是一个非常不好的行为。

ConcreteObserver

实现了update()方法。

实现步骤

1.建立接口和抽象类

public interface Observer {

public String getmName();

void update(String weather);

}

public abstract class Subject {

//保存观察者的集合

public List observers=new ArrayList();

/**

* 添加观察者

* @param observer

*/

public void attach(Observer observer){

observers.add(observer);

System.out.println(observer.getmName()+"订阅天气预报");

}

/**

* 移除观察者

*/

public void detach(Observer observer){

observers.remove(observer);

System.out.println(observer.getmName()+"取消订阅天气预报");

}

/**

* 通知所有的观察者改变状态

*/

public void notifyObservers(String weather){

for(Observer observer:observers){

observer.update(weather);

}

}}

2.实现观察者接口

public class ObserserPeople implements Observer {

private String mName;

public ObserserPeople(String name){

this.mName=name;

}

public void update(String weather) {

System.out.println(mName+"收到天气预报消息"+weather);

}

public String getmName() {

return mName;

}}

3.继承被观察者抽象类

public class WeatherSubject extends Subject {

public void change(String weather){

notifyObservers(weather);

}}

这样我们就写完了,下面我们编写一个测试类:

public class Test {

public static void main(String[] args) {

Observer observer=new ObserserPeople("校长");

Observer observer2=new ObserserPeople("主任");

Observer observer3=new ObserserPeople("老师");

WeatherSubject subject=new WeatherSubject();

subject.attach(observer);

subject.attach(observer2);

subject.attach(observer3);

subject.change("下个周即将下雪!!!");

subject.detach(observer3);

subject.change("下周不下雪了!");

}}

输出结果如下:

校长订阅天气预报

主任订阅天气预报

老师订阅天气预报

校长收到天气预报消息下个周即将下雪!!!

主任收到天气预报消息下个周即将下雪!!!

老师收到天气预报消息下个周即将下雪!!!

老师取消订阅天气预报

校长收到天气预报消息下周不下雪了!

主任收到天气预报消息下周不下雪了!

通过上面例子,可以看出,当观察者订阅了被观察者时,被观察者改变立马会通知观察者,观察者就会执行update()方法。当然,我在这里没有做实现。具体可以更具业务逻辑来进行实现。

观察者模式java类图_初探Java设计模式------观察者模式相关推荐

  1. startuml java 类图_【StarUML】类图

    类图是可视化地表现类的属性和方法,以及类与类之间的关系. 1.类 a.类 普通实体类,它有对应的属性和方法: 双击类名,会弹出一些控制按钮: 右边区域,各个图标的含义依次是: 增加类的属性.增加类的操 ...

  2. visio uml 画java类图_用visio画UML类图

    对于画类图的工具很多,曾经学过用starUML画类图,但这个是用于Java语言的,对于用vs编程C++语言,个人感觉用visio会好一点.以下用以前面的俄罗斯方块游戏中的一个Block类为例来讲述 c ...

  3. java类索引_《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合...

    讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...

  4. java 类 关系_总结Java类关系

    什么是关系? 关系是指事物之间存在单向或双向的作用或者影响的状态.其中类与类之间要么有关系要么没关系,感觉这句话有点说的很无耻,谁都知道,但是其中奥妙在于很难确定类与类之间是否有关系.证明两个或者多个 ...

  5. java 类大写_记java实体类属性名为全部为大写踩的坑(基础)

    1.今天后台使用实体类接收参数,然后有个参数发现明明前后都是对应的,但是那个属性偏偏的不到数据 后面百度才知道(写前端太久java基础都给忘了,该补补了) spring默认的命名方式为,首字母转小写, ...

  6. java 线图_在Java中绘制一个简单的线图

    您的代码和建议的问题: >再次,您需要更改组件的preferredSize(这里是Graph JPanel),而不是大小 >不要设置JFrame的边界. >在添加组件之后并在调用se ...

  7. java 鱼刺图_使用java实现鱼刺图

    刚毕业了,这是毕业设计的java web项目中的一个功能,使用鱼刺图进行辅助管理,在做的过程中,没有找到国内有公开的研究资料,不管是哪一种语言,所以就自己做了一个java的鱼刺图生成插件,虽然毕业设计 ...

  8. java 分时图_软件设计模式(观察者模式)——模拟股票价格变动并绘制分时图和K线图...

    一.观察者模式简介: 首先看百度百科上对观察者模式的简介:观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数 ...

  9. Eclipse 插件用法:Eclipse 利用 Amateras UML 生成 Java 类图、时序图和 UML 类图

    文章目录 前言 一.安装 Eclipse 官方提供的安装框架 GEF 1.1.Eclipse 中第三方插件更新/安装策略 1.2.为什么选择 GEF 框架? 1.3.GEF 框架安装 二.安装 Ama ...

最新文章

  1. NodeJS优缺点及适用场景讨论
  2. [转]American Dream 是指什麽
  3. POJ1228(稳定凸包问题)
  4. jquery 滚动条插件
  5. 常用的分隔符有哪三种_加固博士:常用防水材料大比拼,究竟花落谁家?
  6. java行业报告_2018年Java生态行业报告
  7. idea 注解报错_SpringBoot 遗忘后的简单快速回忆之环境搭建与常见注解
  8. 换行与回车(\r \n)的起源以及在编制语言中的使用
  9. 计算机黑屏什么原因,教您电脑黑屏的原因是什么
  10. Android文字转语音
  11. D轮融资1亿美金,6亿美金估值,3位计算机学霸如何带领海归团队创造业内神话?!...
  12. java中求梯形的面积_java 求梯形面积
  13. 多元统计分析最短距离法_多元统计分析-聚类分析
  14. QQ自由幻想刺客加点
  15. Android听筒模式和免提模式的切换
  16. xray扫描器的使用 (长亭科技公司创造)
  17. jQuery根据ID、CLASS、等获取对象
  18. 第四篇 fluter中为应用添加事件和导航
  19. 基于深度学习的两种信源信道联合编码
  20. 各类指数数据(商品价格指数、消费者价格指数和企业景气及信心指数)

热门文章

  1. JPA还是JDBC?
  2. Mybatis 开发 dao 的方法
  3. Spring Boot-------JPA——EntityManager构建通用DAO
  4. Linux打包压缩.md
  5. PHP 实现定时任务的几种方法
  6. 如何解决cellIndex在IE下兼容性问题
  7. 关于FragmentManager动态管理Fragment时Fragment生命周期的探究
  8. POJ 1469 COURSES 二分图最大匹配
  9. Android 中View仅仅能接收到ACTION_DOWN无法接收ACTION_MOVE和ACTION_UP解决的方法
  10. mount.nfs: Stale file handle的解决方法