JAVA设计模式—观察者模式和Reactor反应堆模式
观察者模式基础
以下是小孩哭这个动作,通知所观察者(Mum Dad Dog)做出不同的反应
/**
* 分离观察者与被观察者
*/ class Child {
private boolean cry = false;
private List<Observer> observers = new ArrayList<>(); {
observers.add(new Dad());
observers.add(new Mum());
observers.add(new Dog());
} public boolean isCry() {
return cry;
} public void wakeUp() {
cry = true;
for(Observer o : observers) {
o.actionOnWakeUp();
}
}
}
/**定义主题对象接口 观察者接口**/
interface Observer {
void actionOnWakeUp();
} class Dad implements Observer {
public void feed() {
System.out.println("dad feeding...");
} @Override
public void actionOnWakeUp() {
feed();
}
} class Mum implements Observer {
public void hug() {
System.out.println("mum hugging...");
} @Override
public void actionOnWakeUp() {
hug();
}
} class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
} @Override
public void actionOnWakeUp() {
wang();
}
} public class Main {
public static void main(String[] args) {
Child c = new Child();
//do sth
c.wakeUp();
}
}
dad feeding...
dog wang...
mum hugging...
观察者模式本身比较简单 就是多态的应用
很多时候 观察者需要根据这件事的具体情况做出相应的处理:比如小孩哭的时间和地点,观察者做出的反应应该不同
下面对观察者模式进行进一步的封装
抽象出处理事件类
把小孩哭得所有状况传到一个事件里面
//事件类 fire Event
class wakeUpEvent{
long timestamp;
String loc; public wakeUpEvent(long timestamp, String loc) {
this.timestamp = timestamp;
this.loc = loc;
}
} interface Observer {
void actionOnWakeUp(wakeUpEvent event);
}
有点类似发布订阅,发布者发布一个事件,订阅者接收这个事件
事件类增加事件源对象,并形成继承体系
大多数时候,我们处理事件的时候,需要事件源对象(有时观察者需要事件原对象的一些资源)
class wakeUpEvent{
long timestamp;
String loc;
Child source;
public wakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
}
因为我们都是面向接口编程 所以把事件定义一个接口或者抽象类。这也是多态的应用
abstract class Event<T> {
abstract T getSource();
}
class wakeUpEvent extends Event<Child>{
long timestamp;
String loc;
Child source;
public wakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
@Override
Child getSource() {
return source;
}
}
其实Observer Listener Hook CallBack 这些都是观察者模式
最终代码
package com.mashibing.dp.observer.v8; import java.util.ArrayList;
import java.util.List; /**
* 有很多时候,观察者需要根据事件的具体情况来进行处理
* 大多数时候,我们处理事件的时候,需要事件源对象
* 事件也可以形成继承体系
*/ class Child {
private boolean cry = false;
private List<Observer> observers = new ArrayList<>(); {
observers.add(new Dad());
observers.add(new Mum());
observers.add(new Dog());
observers.add((e)->{
System.out.println("ppp");
});
//hook callback function
} public boolean isCry() {
return cry;
} public void wakeUp() {
cry = true; wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this); for(Observer o : observers) {
o.actionOnWakeUp(event);
}
}
} abstract class Event<T> {
abstract T getSource();
} class wakeUpEvent extends Event<Child>{
long timestamp;
String loc;
Child source; public wakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
} @Override
Child getSource() {
return source;
}
} interface Observer {
void actionOnWakeUp(wakeUpEvent event);
} class Dad implements Observer {
public void feed() {
System.out.println("dad feeding...");
} @Override
public void actionOnWakeUp(wakeUpEvent event) {
feed();
}
} class Mum implements Observer {
public void hug() {
System.out.println("mum hugging...");
} @Override
public void actionOnWakeUp(wakeUpEvent event) {
hug();
}
} class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
} @Override
public void actionOnWakeUp(wakeUpEvent event) {
wang();
}
} public class Main {
public static void main(String[] args) {
Child c = new Child();
//do sth
c.wakeUp();
}
}
ApplicationListener
Spring中的ApplicationListener也是使用的观察者模式,下面两种方式做比较
https://www.cnblogs.com/ssskkk/p/12942375.html#_label2
JAVA设计模式—观察者模式和Reactor反应堆模式的更多相关文章
- java设计模式--观察者模式和事件监听器模式
观察者模式 观察者模式又称为订阅—发布模式,在此模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来事件 ...
- java设计模式-观察者模式,装饰者模式
1.1定义 慨念:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 即:主题和观察者定义了一对多的关系,观察者依赖于主题,只要主题发生变化,观察者就 ...
- Java设计模式之《职责链模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ...
- Java设计模式之《享元模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...
- Java设计模式之《调停者模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6518603.html 调停者模式. 我们想象一下这样的场景:一个系统内部通过许多的类互相之 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- Java设计模式之《构建者模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6553374.html 构建者模式,又称建造者模式,将一部负责对象的构建分为许多小对象的构建 ...
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- Java设计模式(21)访问模式(Visitor者模式)
Visitor定义:作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元 ...
随机推荐
- Spring框架xml配置中属性ref与value的区别
1.spring批量扫描mybatis的mapper,使用value 2.spring管理mybatis的单个mapper,用的是ref 虽然引用的是同一个bean,但两个对象的属相类型明显不一样,一 ...
- js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现,兼容火狐,谷歌;canvas截屏跨域问题,无音频视频流加载不显示问题
项目:物联网监控项目----后台视频流管理(前端实现视频截屏功能) 本文就不同视频源分情况展示: 1 本地视频(项目同目录视频)截屏(canvas.getContext("2d).drawI ...
- Java遍历Map对象的四种方式
关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 :这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> m ...
- Linux 下 MySQL-5.6.16 安装
转载请注明出处!!!! 卸载mysql 1 查找以前是否装有 mysql 命令:rpm -qa|grep -i mysql 2 将所有包删除 删除命令:rpm -e --nodeps 包名 3 删除 ...
- ansible理解
目录 inventory文件 patterns 模块 ansible配置文件 PlayBook使用 inventory文件 [cassandra:children] shcp-01 shcp-06 b ...
- How does rt.jar works?
转载自:https://stackoverflow.com/questions/30222702/how-does-java-link-lib-rt-jar-to-your-app-at-runtim ...
- Vue面试中,经常会被问到的面试题/Vue知识点整理
一.对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写.Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑.View 代表UI 组件,它负责将数 ...
- excel导出使用get请求参数过长问题
遇到的问题: excel导出功能时,使用的是window.location.href=url也就是get请求.当传入参数过长的时候就报了414,地址过长的错误. 解决思路: 将get请求换为post请 ...
- 基本排序算法(Java)
基本排序算法 (Java) 经过几次笔试,发现自己的Java基础有些薄弱,基本的排序算法掌握的还不够熟练,需要多加学习总结. 1. 选择排序 思想: 给定一个整数数组,例 int[] a ={38,6 ...
- LocalDate、LocalDateTime、LocalTime开发小结
在我之前的文章<[整理]Java 8新特性总结 >中有提到Date/Time API (JSR 310)对日期与时间的处理.它将服务端对时间的处理进行了统一,使得对时间的处理更加规范和统一 ...