Java 设计模式 – Observer 观察者模式
代码
说明都在注释:
观察者接口:
package ObserverModel;
/**
* 观察者,定义update方法,意为接收从被观察者那里反馈的信息
*/
public interface Observer {
/**
* @param message 接收的信息,可以是任意类型,这里是String
*/
void update(String message);
}
被观察者:
package ObserverModel;
/**
* 抽象接口被观察者,比如微信公众号或者电影等
*/
public interface Observerable {
/**
* 注册一个新的观察者
*
* @param observer 观察者
*/
void registerObserver(Observer observer);
/**
* 删除观察者
*
* @param observer 观察者
*/
void removeObserver(Observer observer);
/**
* 通知观察者
*/
void notifyObserver();
}
观众类 :
package ObserverModel;
/**
* 观众 实现观察者接口
*/
public class Audience implements Observer {
//名字
private String name;
//收到的信息
private String message;
Audience(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
watch(message);
}
/**
* 打印被观察者发出的信息
*
* @param information 信息
*/
void watch(String information) {
System.out.println(name + "看到了:" + message);
}
}
电影类:
package ObserverModel;
import java.util.ArrayList;
import java.util.List;
/**
* 电影类
*/
public class Movie implements Observerable {
/**
* 观众,这里就是观察者
*/
private List<Observer> observers;
Movie() {
this.observers = new ArrayList<>();
}
/**
* 被观察者传递出的信息,比如剧情,画面等
*/
private String information;
/**
* 有人来看电影,添加一个观察者
*
* @param observer 观察者
*/
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
/**
* 观众走了,从观众中移除
*
* @param observer 观察者
*/
@Override
public void removeObserver(Observer observer) {
if (observers.size() > 0) {
observers.remove(observer);
}
}
/**
* 这里的notifyObserver可以理解为向观察者传递信息,比如看电影就是再从电影中获取信息
*/
@Override
public void notifyObserver() {
observers.forEach(observer -> {
observer.update(information);
});
}
/**
* 被观察者生产消息时,给所有观察者发送通知
* @param information
*/
public void setInformation(String information) {
this.information = information;
notifyObserver();
}
}
效果如下:
package ObserverModel;
public class MainTest {
public static void main(String[] args) {
//泰坦尼克号
Movie titanic = new Movie();
Observer zhangsan = new Audience("张三");
Observer lisi = new Audience("李四");
Observer wangwu = new Audience("王五");
titanic.registerObserver(zhangsan);
titanic.registerObserver(lisi);
titanic.registerObserver(wangwu);
titanic.setInformation("jack is dead!");
//oh no ,太虐了,不看了!
titanic.removeObserver(wangwu);
titanic.setInformation("rose not dead!");
}
// 张三看到了:jack is dead!
// 李四看到了:jack is dead!
// 王五看到了:jack is dead!
// 张三看到了:rose not dead!
// 李四看到了:rose not dead!
}
参考:
https://www.cnblogs.com/luohanguo/p/7825656.html
Java 设计模式 – Observer 观察者模式的更多相关文章
- java设计模式之观察者模式
观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...
- 理解java设计模式之观察者模式
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...
- 折腾Java设计模式之观察者模式
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...
- JAVA设计模式 之 观察者模式(JDK内置实现)
简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...
- java设计模式之观察者模式以及在java中作用
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...
- java设计模式02观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...
- 17.java设计模式之观察者模式
基本需求: 气象站可以将每天测量到的温度,湿度,气压等等,以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度.气压和湿度的接口 ...
- 什么?女神发了朋友圈,快来围观之Java设计模式:观察者模式
目录 观察者模式 示例 定义 设计原则 意图 主要解决问题 何时使用 优缺点 女神和追求者的故事 Java中的实现 观察者模式 示例 微信公众号,关注就可以收到推送的消息,取消关注就不会收到 定义 定 ...
- C++设计模式-Observer观察者模式
Observer观察者模式作用:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己 UML图: S ...
随机推荐
- code forces 1176 D. Recover it!
原题链接:https://codeforces.com/contest/1176/problem/D 题目大意是 两个个数列 a , b 相同 ,如果 ai 是素数,那么b数列里添加上第ai个素数(2 ...
- python数据库-安装问题总结(48)
一.ERROR1698(28000):Access denied for user root@localhost错误 我的操作系统是ubuntu: 我的MySQL版本是: 安装完成后,登录mysql的 ...
- flask 请求上下文源码(转)
本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...
- UAVStack的慢SQL数据库监控功能及其实现
UAVStack是一个全维监控与应用运维平台.UAV.Monitor具备监控功能,包含基础监控.应用/服务性能监控.日志监控.业务监控等.在应用监控中,UAV可以根据应用实例画像:其中应用实例组件可以 ...
- [常用命令]OSX命令
在mac os下,如何通过命令行来下载网络文件?如果你没有安装或wget命令,那么可以使用curl工具来达到我们的目的. curl命令参数: curl ‘url地址’ curl [选项] ‘url地址 ...
- 用Python玩数据-笔记整理-第一章
第一个程序:print >>>print("Hallo World!") >>>Hallo World! mystring = "Ha ...
- .net持续集成cake篇之cake任务依赖、自定义配置荐及环境变量读取
系列目录 新建一个构建任务及任务依赖关系设置 上节我们通过新建一个HelloWorld示例讲解了如何编写build.cake以及如何下载build.ps1启动文件以及如何运行.实际项目中,我们使用最多 ...
- 关于Linux服务器配置java环境遇到的问题
关于Linux服务器配置java环境遇到的问题 将下载好的JDK安装包解压到/etc/local/路径下,安装完后用vim/etc/profile文件,在文件末尾添加 export JAVA_HOME ...
- python 中_init_函数以及参数self
1)class类包含: 类的属性:类中所涉及的变量 类的方法:类中函数 2)_init_函数(方法) 1.首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问. 2. ...
- MapReduce之提交job源码分析 FileInputFormat源码解析
MapReduce之提交job源码分析 job 提交流程源码详解 //runner 类中提交job waitForCompletion() submit(); // 1 建立连接 connect(); ...