深入理解Java设计模式之观察者模式
前言
观察者,即时observer,总结来说就是一个当一个被观察的对象的状态发生变化时,会通知相应的观察者对象。
观察者模式定义了四种角色:抽象主题、具体主题、抽象观察者、具体观察者
1.抽象主题(Subject):通常为接口或抽象类,定义一系列操作,如订阅,取消订阅,通知等方法
2.具体主题(Concrete Subject):具体主题,继承或实现抽象主题,实现相应的逻辑,如维护与观察者的关系,将自身的状态变化告知观察者。
3.抽象观察者(Observer):定义观察者行为
4.具体观察者(Concrete Observer):实现观察者行为,实现收到被观察者的通知后将要处理的逻辑
举个例子,Lz比较喜欢看杂志,所以订阅了“意林”杂志的公众号,此时我就是观察者,而“意林”杂志的公众号则是被观察者,当新一期的杂志出版时,即被观察者有状态变化,公众号就会给我推送通知。
所以说公众号是具体主题,而我是具体观察者,我们之间的关系是由公众号一方来维护的。
代码演示:
//抽象观察者
interface Observer{
public void update(String message);
}
//具体观察者
class MyWeixin implements Observer{ @Override
public void update(String message) {
System.out.println("我收到的通知: " + message);
}
}
//抽象主题
interface Subject{
//订阅
public void registerObserver(Observer observer);
//取消订阅
public void unregisterObserver(Observer observer);
//通知
public void notifyObserver(String message);
}
//具体主题,实现一系列逻辑操作,维护与观察者的关系
class YLi implements Subject{ //维护与观察者的关系
private List<Observer> relationList = new ArrayList<>(); @Override
public void registerObserver(Observer observer) {
relationList.add(observer);
} @Override
public void unregisterObserver(Observer observer) {
relationList.remove(observer);
} @Override
public void notifyObserver(String message) {
for (int i=0; i < relationList.size(); i++){
Observer observer = relationList.get(i);
observer.update(message);
}
}
}
测试代码:
public class ObserverPatternTest { public static void main(String[] args){
Observer observer = new MyWeixin();
Subject subject = new YLi();
subject.registerObserver(observer);
subject.notifyObserver("新的一期意林杂志出版了!");
subject.unregisterObserver(observer);
} }
控制台打印
总结:观察者模式在有的书里又称为发布/订阅模式,当需要对某个对象的状态进行检测时,则可以使用该设计模式。例如观察检测温度超过某阈值时,向APP推送短信提醒。
与MQTT协议的话题订阅推送其实是类似的,基本流程都是先订阅维护一个关系,在有状态变化时则给相应的观察者推送数据,唯一不同的是观察与被观察的关系是由谁来维护。
深入理解Java设计模式之观察者模式的更多相关文章
- 理解java设计模式之观察者模式
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...
- 从源码角度理解Java设计模式——装饰者模式
一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...
- java设计模式之观察者模式以及在java中作用
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...
- java设计模式02观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...
- JAVA设计模式之观察者模式 - Observer
有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...
- java设计模式之观察者模式
观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...
- JAVA设计模式 之 观察者模式
简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...
- 折腾Java设计模式之观察者模式
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...
- java设计模式之-观察者模式(发布-订阅模式)
1.观察者模式定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己. 2.观察者模式结构 ...
随机推荐
- Spark RPC框架源码分析(一)简述
Spark RPC系列: Spark RPC框架源码分析(一)运行时序 Spark RPC框架源码分析(二)运行时序 Spark RPC框架源码分析(三)运行时序 一. Spark rpc框架概述 S ...
- LAMP动静分离安装(源码安装)
环境: 版本 IP地址 源码包版本 Centos7.5_mysql 192.168.111.3 mysql-5.7.24.tar.gz,cmake-3.13.1.tar.gz,boost_1_59_0 ...
- 记录Javascript的数据方法参考
concat >>连接2个或更多数组,并返回结果 var arr1 = [1,2,3]; var arr2 = [-1,-2,-3]; console.log(arr1.concat(ar ...
- Linux 压缩某个文件夹命令
tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.ta ...
- ASP.NET MVC 自定义模型绑定1 - 自动把以英文逗号分隔的 ID 字符串绑定成 List<int>
直接贴代码了: CommaSeparatedModelBinder.cs using System; using System.Collections; using System.Collection ...
- lombok使用
下载地址 链接:https://pan.baidu.com/s/19Rz7sgasVv5Gc7vw1A4whA 提取码:6bgg lombok的安装: 使用lombox是需要安装的,如果不安装,IDE ...
- MYSQL内置MYSQL数据库中你可以得到的信息
1:help_topic 可以查看函数帮助,例如:SELECT * from help_topic WHERE name='concat' 可以查看concat函数. 2:SLOW_LOG 慢查询日 ...
- 突击战 (uva 11729)贪心
思路:就是把J大的放在前面.为什么这样贪心呢? 看看这个图 #include<iostream> #include<algorithm> #include<vector& ...
- input type类型和input表单属性
一.input type类型 1.Input 类型 - email 在提交表单时,会自动验证 email 域的值. E-mail: <input type="email" n ...
- API简介
概述 API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的 字典 ,是JDK中提供给我们使用的类的说明文档.这些类将底层的代码 ...