代码

说明都在注释:

观察者接口:


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. JVM中ClassLoader的学习

    JVM中class loaderの学习 一..class文件和jvm的关系 类的加载 所有的编译生成的.class文件都会被直接加载到JVM里面来吗(并不 首先我们明确一个概念,.class文件加载到 ...

  2. TypeScript算法与数据结构-数组篇

    数组是数据结构中最简单,也是使用最广泛的一种.在原生的js中,数组给我们提供了很多方便的操作方法,比如push(), pop(), shift(), unshift().但是出于对数据结构的学习,我们 ...

  3. Ubuntu 16.4-desktop系统安装显卡CUDA具体步骤!

    1.禁用nouveau驱动(切换至tty界面) sudo vim /etc/modprobe.d/blacklist.conf 在文本最后添加:blacklist nouveau options no ...

  4. Minimum Spanning Tree

    前言 说到最小生成树(Minimum Spanning Tree),首先要对以下的图论概念有所了解. 图 图(Graph)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象.图的定义方式有两种 ...

  5. Linux命令学习-mv命令

    Linux中,mv命令的全称是move,主要作用是移动文件或文件夹,类似于Windows下的剪切功能,同时还可以用于修改名字. 假设当前处于wintest用户的主目录,路径为 /home/wintes ...

  6. java字符串的替换replace、replaceAll、replaceFirst的区别

    看代码: String s = "my.test.txt"; System.out.println(s.replace(".", "#")) ...

  7. 彻底搞清楚c#中的委托和事件

    一.什么是委托呢? 听着名字挺抽象,确实不好理解.面试官最喜欢考察这个,而且更喜欢问:“委托和事件有何异同?”.如果对一些知识点没有想明白,那么很容易被绕进去.研究任何事物,我们不妨从它的定义开始,委 ...

  8. android_sdcard读写(三)

    这次来个稍微复杂点的. package cn.com.sxp;import android.app.Activity;import android.app.ProgressDialog;import ...

  9. Image Classification

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  10. [原创]自动化部署K8S(v1.10.11)集群

          标准运维实现自动化部署K8S集群主要分两步,第一步是部署gse-agent,拱第二步执行部署. 第一步:部署gse-agent.如下: 第二步:部署k8s集群.主要通过作业平台分为5小步执 ...