观察者模式java类图_初探Java设计模式------观察者模式
前言
最近刚开始学习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设计模式------观察者模式相关推荐
- startuml java 类图_【StarUML】类图
类图是可视化地表现类的属性和方法,以及类与类之间的关系. 1.类 a.类 普通实体类,它有对应的属性和方法: 双击类名,会弹出一些控制按钮: 右边区域,各个图标的含义依次是: 增加类的属性.增加类的操 ...
- visio uml 画java类图_用visio画UML类图
对于画类图的工具很多,曾经学过用starUML画类图,但这个是用于Java语言的,对于用vs编程C++语言,个人感觉用visio会好一点.以下用以前面的俄罗斯方块游戏中的一个Block类为例来讲述 c ...
- java类索引_《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合...
讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...
- java 类 关系_总结Java类关系
什么是关系? 关系是指事物之间存在单向或双向的作用或者影响的状态.其中类与类之间要么有关系要么没关系,感觉这句话有点说的很无耻,谁都知道,但是其中奥妙在于很难确定类与类之间是否有关系.证明两个或者多个 ...
- java 类大写_记java实体类属性名为全部为大写踩的坑(基础)
1.今天后台使用实体类接收参数,然后有个参数发现明明前后都是对应的,但是那个属性偏偏的不到数据 后面百度才知道(写前端太久java基础都给忘了,该补补了) spring默认的命名方式为,首字母转小写, ...
- java 线图_在Java中绘制一个简单的线图
您的代码和建议的问题: >再次,您需要更改组件的preferredSize(这里是Graph JPanel),而不是大小 >不要设置JFrame的边界. >在添加组件之后并在调用se ...
- java 鱼刺图_使用java实现鱼刺图
刚毕业了,这是毕业设计的java web项目中的一个功能,使用鱼刺图进行辅助管理,在做的过程中,没有找到国内有公开的研究资料,不管是哪一种语言,所以就自己做了一个java的鱼刺图生成插件,虽然毕业设计 ...
- java 分时图_软件设计模式(观察者模式)——模拟股票价格变动并绘制分时图和K线图...
一.观察者模式简介: 首先看百度百科上对观察者模式的简介:观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数 ...
- Eclipse 插件用法:Eclipse 利用 Amateras UML 生成 Java 类图、时序图和 UML 类图
文章目录 前言 一.安装 Eclipse 官方提供的安装框架 GEF 1.1.Eclipse 中第三方插件更新/安装策略 1.2.为什么选择 GEF 框架? 1.3.GEF 框架安装 二.安装 Ama ...
最新文章
- NodeJS优缺点及适用场景讨论
- [转]American Dream 是指什麽
- POJ1228(稳定凸包问题)
- jquery 滚动条插件
- 常用的分隔符有哪三种_加固博士:常用防水材料大比拼,究竟花落谁家?
- java行业报告_2018年Java生态行业报告
- idea 注解报错_SpringBoot 遗忘后的简单快速回忆之环境搭建与常见注解
- 换行与回车(\r \n)的起源以及在编制语言中的使用
- 计算机黑屏什么原因,教您电脑黑屏的原因是什么
- Android文字转语音
- D轮融资1亿美金,6亿美金估值,3位计算机学霸如何带领海归团队创造业内神话?!...
- java中求梯形的面积_java 求梯形面积
- 多元统计分析最短距离法_多元统计分析-聚类分析
- QQ自由幻想刺客加点
- Android听筒模式和免提模式的切换
- xray扫描器的使用 (长亭科技公司创造)
- jQuery根据ID、CLASS、等获取对象
- 第四篇 fluter中为应用添加事件和导航
- 基于深度学习的两种信源信道联合编码
- 各类指数数据(商品价格指数、消费者价格指数和企业景气及信心指数)
热门文章
- JPA还是JDBC?
- Mybatis 开发 dao 的方法
- Spring Boot-------JPA——EntityManager构建通用DAO
- Linux打包压缩.md
- PHP 实现定时任务的几种方法
- 如何解决cellIndex在IE下兼容性问题
- 关于FragmentManager动态管理Fragment时Fragment生命周期的探究
- POJ 1469 COURSES 二分图最大匹配
- Android 中View仅仅能接收到ACTION_DOWN无法接收ACTION_MOVE和ACTION_UP解决的方法
- mount.nfs: Stale file handle的解决方法