代码

说明都在注释:

观察者接口:


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 观察者模式的更多相关文章

  1. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  2. 理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...

  3. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  4. JAVA设计模式 之 观察者模式(JDK内置实现)

    简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...

  5. java设计模式之观察者模式以及在java中作用

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...

  6. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  7. 17.java设计模式之观察者模式

    基本需求: 气象站可以将每天测量到的温度,湿度,气压等等,以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度.气压和湿度的接口 ...

  8. 什么?女神发了朋友圈,快来围观之Java设计模式:观察者模式

    目录 观察者模式 示例 定义 设计原则 意图 主要解决问题 何时使用 优缺点 女神和追求者的故事 Java中的实现 观察者模式 示例 微信公众号,关注就可以收到推送的消息,取消关注就不会收到 定义 定 ...

  9. C++设计模式-Observer观察者模式

    Observer观察者模式作用:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己 UML图: S ...

随机推荐

  1. vSphere 5.5.0 U1配置问题:主机的快速统计信息不是最新的(转载)

    最近公司新购置了几台DELL服务器用来上桌面虚拟化,前期搭建测试环境进行功能验证,底层自然而然的选择VMware ESXi,当前最新版本为ESXi 5.5.0 U1,单独数据库安装,相对5.1来说,5 ...

  2. python多线程爬取图片实例

    今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题.网址还是那个网址https://www.quanjing.com/category/1286521/1. ...

  3. iOS自动化探索(十)代码覆盖率统计

    iOS APP代码覆盖率统计 今年Q3季度领导给加了个任务要做前后端代码覆盖率统计, 鉴于对iOS代码代码比较熟就选择先从iOS端入手,折腾一整天后终于初步把流程跑通了记录如下 覆盖率监测的原理 Xc ...

  4. Sending Operations to Multiple Threads_翻译

    The speed and efficiency of a long-running, data-intensive operation often improves when you split i ...

  5. Gin 框架 - 使用 logrus 进行日志记录

    目录 概述 日志格式 Logrus 使用 推荐阅读 概述 上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录. 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirup ...

  6. 【dfs基础讲解及例题】

    定义 DFS(Depth-First-Search)深度优先搜索算法,是搜索算法的一种. 接下来因为懒得去找大段大段深奥的材料 所以就是一些个人的理解. 所谓深搜,是相对于广搜(只是第一篇)来说的.深 ...

  7. 洛谷P3275 [SCOI2011]糖果 题解

    题目链接: https://www.luogu.org/problemnew/show/P3275 分析: 本题就是一个裸的差分约束. 核心: x=1x=1x=1时,a=b,a−>b,b−> ...

  8. 安卓图片加载框架--Universal-Image-Loader

    今天来介绍图片加载的框架Android-Universal-Image-Loader GITHUB上的下载路径为:https://github.com/nostra13/Android-Univers ...

  9. 个人永久性免费-Excel催化剂功能第79波-自动及手动备份功能,比Onedrive还好用

    在OFFICE365里,有个自动保存功能,可惜保存的地址是在Onedrive里,在中国国情下,备份十分卡顿,近乎难以忍受的慢.虽然现在收费性的网盘部分是可以有文件版本的备份功能,但也是繁琐且最要命的是 ...

  10. Error:too many padding sections on bottom border.

    异常信息: Error:too many padding sections on bottom border. 原因: 使用andoridstudio制作.9图错误. 解决 只怪我把线画多了. 修改后 ...