代码

说明都在注释:

观察者接口:


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. Spring Boot 打包成的可执行 jar ,为什么不能被其他项目依赖?

    前两天被人问到这样一个问题: "松哥,为什么我的 Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误?" 大伙有这样的疑问,就是因为还没搞清楚 ...

  2. mpvue开发微信小程序

    前段时间,美团开源了mpvue这个项目,使得我们又多了一种用来开发小程序的框架选项.由于mpvue框架是完全基于Vue框架的(重写了其runtime和compiler),因此在用法上面是高度和Vue一 ...

  3. Linux安装httpd

    一.相关下载 1.httpd下载 官网下载:http://httpd.apache.org/ 或者 百度网盘链接: https://pan.baidu.com/s/1JPdU28tv6rePKJanB ...

  4. Java编程思想:序列化深层部分

    import java.io.*; import java.util.ArrayList; import java.util.List; public class Test { public stat ...

  5. 从byte数组byte[]转换为bitmapsource以及反射实现属性批量赋值

    从byte数组byte[]转换为bitmapsource (BitmapSource)new ImageSourceConverter().ConvertFrom(b) 名字有规律的属性代码用反射优美 ...

  6. youku_androidid

    youku_androidid = 1310; imei screenwidth screenhight

  7. UVA10071 Back to High School Physics:题解

    题目链接:https://www.luogu.org/problemnew/show/UVA10071 题意简叙: 粒子从0速度提速到t时速度为v,求出2*t时所运动的距离 分析: 这道题是一道物理题 ...

  8. VUE过滤器的使用 vue 时间格式化

    过滤器介绍 官方教程地址:https://cn.vuejs.org/v2/guide/filters.html 过滤器常被用于一些文本格式化 我们可以自定义过滤器,可以实现各种各样的功能. vue时间 ...

  9. 2019杭电多校第一场hdu6581 Vacation

    Vacation 题目传送门 update(O(n)) 看了那个O(n)的方法,感觉自己想的那个O(nlogn)的好傻,awsl. 0车最终通过停车线的时候,状态一定是某个车堵住后面的所有车(这个车也 ...

  10. Java中的I/O输入输出流概述

    流是一组有序的数据序列,根据操作类型,可以分为输入流和输出流两种,Java语言中定义的负责各种输入输出的类都被放在java.io包中.其中所有的输入流类都是抽象类InputStream(字节输入流)或 ...