Java观察者模式讲解及代码实现
概念
观察者模式又叫做发布-订阅模式,是对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
组成
- 抽象主题角色(Subject)
也叫抽象目标类,抽象主题知道自己的观察者有哪些,提供删除和新增观察者的方法以及通知观察者的抽象方法,由抽象类或接口实现
- 抽象观察者角色(Observer)
包含了一个更新的抽象方法,当收到具体主题的更新通知后调用,由抽象类或接口实现
- 具体主题角色(Concrete Subject)
也叫具体目标类,实现抽象目标类的通知方法,当具体主题发生改变时通知所有订阅自己的观察者
- 具体观察者角色(Concrete Observer)
实现抽象观察者角色的抽象方法,收到主题更改通知后更改自身状态
实现
- 抽象观察者Observer接口
包含一个观察者接收通知改变自身状态方法
public interface Observer {//收到通知,改变自身状态void update();
}
- 具体观察者ObserverOne和ObserverTwo
实现Observer接口中的update方法
public class ObserverOne implements Observer{@Overridepublic void update() {System.out.println("第一个观察者收到通知,状态更新了");}
}
public class ObserverTwo implements Observer {@Overridepublic void update() {System.out.println("第二个观察者收到通知,状态更新了");}
}
- Subject接口
包含添加,删除,通知观察者方法,由抽象目标类实现,还有一个自身操作的方法,由具体目标类实现
public interface Subject {//添加观察者void add(Observer observer);//删除观察者void remove(Observer observer);//通知所有观察者void notifyObservers();//自身操作void operation();
}
- 抽象目标类AbstractSubject
抽象类,因为观察者数量不固定,所以使用Vector动态数组存储观察者,实现Subject接口中的add,remove,notifyObservers方法,operation方法由具体目标类实现
public abstract class AbstractSubject implements Subject{Vector<Observer> vector = new Vector<Observer>();@Overridepublic void add(Observer observer){vector.add(observer);}@Overridepublic void remove(Observer observer){vector.remove(observer);}@Overridepublic void notifyObservers(){for (Observer observer : vector) {observer.update();}}
}
- 具体目标类MySubject
继承AbstractSubject类,实现operation方法,并在operation方法中调用notifyObservers方法以达到自身状态改变后通知观察者的效果
public class MySubject extends AbstractSubject{@Overridepublic void operation() {System.out.println("具体目标状态改变");System.out.println("正在通知观察者。。。");notifyObservers();System.out.println("通知完毕!");}
}
- 测试类Test
public class Test {public static void main(String[] args) {MySubject mySubject = new MySubject();mySubject.add(new ObserverOne());mySubject.add(new ObserverTwo());mySubject.operation();}
}
总结
- 观察者模式主要解决了什么问题
在低耦合的条件下,一个对象状态发生改变,其他对象会收到通知
- 观察者模式什么时候使用
一个对象状态改变,所有有依赖关系的对象都会收到广播通知
- 观察者模式的优点
观察者和目标是抽象耦合的,低耦合,是一套触发机制
- 观察者模式的缺点
①如果一个目标中依赖的直接观察者和间接观察者有很多的话,通知所有观察者需要花费很多时间
②如果观察者和被观察者之间有循环依赖的话,可能会出现循环调用,导致系统崩溃
③观察者无法知道目标状态是如何变化的,只能知道目标状态发生了改变
- 观察者模式的注意事项
①JAVA中已经有了观察者模式的支持类,可以直接使用
②避免循环调用
③如果顺序执行观察者的更新方法,某一观察者错误会导致系统卡住,一般采用异步方式。
Java观察者模式讲解及代码实现相关推荐
- 狂神说Java CSS3讲解综合代码
狂神说Java CSS3讲解综合代码 <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/ ...
- java 观察者模式讲解_java观察者模式详解
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象.这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新. 观察者 ...
- Java观察者模式事件委托(通过dota和王者荣耀故事讲解)
故事情景 首先介绍下故事的三位同学,阿顾.蛋蛋和洋洋,蛋蛋,洋洋喜欢玩游戏,但是又生怕班主任回来了被抓到,所以他们就找到了阿顾同学帮他们把风,但是阿顾同学不是谁都通知的,只有到阿顾那里登记的,阿顾同学 ...
- Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例)
Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例) Java对象 转 JSON字符串 JAVA对象转MAP Map转java对象 List转map List和Map ...
- java编写螺旋矩阵讲解_Java如何实现螺旋矩阵 Java实现螺旋矩阵代码实例
本篇文章小编给大家分享一下Java实现螺旋矩阵代码实例,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时 ...
- java观察者模式本质_6.[研磨设计模式笔记]观察者模式
1.定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新. 2.解决问题 --订阅报纸 看起来订阅者是直接根有据打交道,但实际上,订阅者的订阅数据 ...
- java 观察者模式示例_观察者设计模式示例
java 观察者模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...
- java类图与代码实例
在 Java编程中,类图是一个非常重要的概念.类图的作用是用来展示类的结构以及类之间的关系.通过类图,可以很方便地展示出对象之间的关系.下面我将使用实例来演示一下我在学习 Java时的类图. 首先我们 ...
- [Java]观察者模式和中介者模式改造机场
[Java]观察者模式和中介者模式改造机场 文章目录 [Java]观察者模式和中介者模式改造机场 题目 代码部分 运行结果 补充 题目 请以下面的情景为基础,将以下的情景进行 优化: 1. 定义4个处 ...
- Java观察者模式理解和实现
今天本想一本正经的把RxJava看一看,想着前段时间RxJava都已经到了第二版,而自己RxJava的认识还只是很基础,甚至连基础都算不上,所以本着以后能在项目里优雅地把他用出来的想法,我开始了RxJ ...
最新文章
- 001-Spring Cloud Edgware.SR3 升级最新 Finchley.SR1,spring boot 1.5.9.RELEASE 升级2.0.4.RELEASE注意问题点...
- 今天看到这篇新闻之后,决定休息一下咯
- python装饰器函数-python 装饰器 函数被装饰+函数执行
- python保留字的基本含义-python 33个保留字是什么意思
- c#对oracle操作时候 出现的乱码问题。
- ubuntu19.04更改国内镜像源
- Angular2.0 基础: Form
- 【练习】c++用链栈实现计算器
- mysql8.0.19.0_分享MySql8.0.19 安装采坑记录
- PowerShell变量——PowerShell三分钟(七)
- 牛客网数据库SQL实战答案解析上篇
- 西普实验吧-ctf-web-1
- 从省市级到区县级,Power BI topoJSON 中国行政区划地图都在这了
- bios调整服务器性能模式吗,怎样更改BIOS设置提高显卡性能
- 从面试官的角度聊聊培训班对程序员的帮助,同时给培训班出身的程序员一些建议
- 我的世界服务器显示大字,我的世界上面指令让界面出现字体 | 手游网游页游攻略大全...
- PHP 对接美团大众点评团购券(门票)
- 24小时制与12小时制的换算
- python-xlrd使用手册
- 2020年中国羊肉行业供需现状、进出口情况及产业链分析,新西兰为羊肉主要进口国「图」
热门文章
- UiBot无法抓取Google Chrome元素和数据抓取工具无法使用的解决方案
- android 激光打印机,#本站首晒# 安卓端无线打印的方案选择 兄弟 DCP1618W 一体机...
- 【Windows10】利用分区助手扩展C盘分区
- VSCode使用Vim插件心得
- 使用 C# 生成 EMF 矢量图形文件
- LaTex中 viso及svg转emf
- Teradata天睿公司发布开源Kylo软件
- idea安装插件后无法启动
- Meta-Learning in Neural Networks: A Survey元学习最新综述(翻译)
- Manchester Reunited 网站设计报告 // 当初的课程论文,纯怀念了=v=