代码

说明都在注释:

观察者接口:


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. code forces 1176 D. Recover it!

    原题链接:https://codeforces.com/contest/1176/problem/D 题目大意是 两个个数列 a , b 相同 ,如果 ai 是素数,那么b数列里添加上第ai个素数(2 ...

  2. python数据库-安装问题总结(48)

    一.ERROR1698(28000):Access denied for user root@localhost错误 我的操作系统是ubuntu: 我的MySQL版本是: 安装完成后,登录mysql的 ...

  3. flask 请求上下文源码(转)

    本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...

  4. UAVStack的慢SQL数据库监控功能及其实现

    UAVStack是一个全维监控与应用运维平台.UAV.Monitor具备监控功能,包含基础监控.应用/服务性能监控.日志监控.业务监控等.在应用监控中,UAV可以根据应用实例画像:其中应用实例组件可以 ...

  5. [常用命令]OSX命令

    在mac os下,如何通过命令行来下载网络文件?如果你没有安装或wget命令,那么可以使用curl工具来达到我们的目的. curl命令参数: curl ‘url地址’ curl [选项] ‘url地址 ...

  6. 用Python玩数据-笔记整理-第一章

    第一个程序:print >>>print("Hallo World!") >>>Hallo World! mystring = "Ha ...

  7. .net持续集成cake篇之cake任务依赖、自定义配置荐及环境变量读取

    系列目录 新建一个构建任务及任务依赖关系设置 上节我们通过新建一个HelloWorld示例讲解了如何编写build.cake以及如何下载build.ps1启动文件以及如何运行.实际项目中,我们使用最多 ...

  8. 关于Linux服务器配置java环境遇到的问题

    关于Linux服务器配置java环境遇到的问题 将下载好的JDK安装包解压到/etc/local/路径下,安装完后用vim/etc/profile文件,在文件末尾添加 export JAVA_HOME ...

  9. python 中_init_函数以及参数self

    1)class类包含: 类的属性:类中所涉及的变量 类的方法:类中函数 2)_init_函数(方法) 1.首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问. 2. ...

  10. MapReduce之提交job源码分析 FileInputFormat源码解析

    MapReduce之提交job源码分析 job 提交流程源码详解 //runner 类中提交job waitForCompletion() submit(); // 1 建立连接 connect(); ...