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结构中的元 ...
随机推荐
- Blend 打开psd文件
1.创建完项目后->文件->导入ps文件->选择psd文件
- 2018-2019-2 20165323《网络攻防技术》Exp5 MSF基础应用
一.知识点总结 1.MSF攻击方法 主动攻击:扫描主机漏洞,进行攻击 攻击浏览器 攻击其他客户端 2.MSF的六种模块 渗透攻击模块Exploit Modules:攻击漏洞,把shellcode&qu ...
- Textwrap模块
该模块首先提供了三个便捷的方法:wrap,fill和decent,也提供了TextWrapper类 textwrap.wrap(text,[width[,…]]) 这个方法是将一个字符串按照width ...
- IntelliJ IDEA添加JUnit单元测试
使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 1.安装JUnit插件步骤 File-->settings-->Plguins-->Browse reposito ...
- 基本urllib库
urlib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urllib ...
- 关于tomcat WEB-INF/lib下类加载顺序
关于tomcat WEB-INF/lib下类加载顺序问题 问题描述 smc应用最近碰到一个线上问题,预发机器规则测试接口没问题,但是线上机器就是调用有问题,表面上看,maven模块引用的是自己想要的j ...
- day20.序列化模块
参考云游道士:https://www.cnblogs.com/yyds/p/6563608.html 1.什么是序列化 序列化就是将字典,数字等数据类型转换为字符串数据类型 所说的序列就是字符串 2. ...
- 周一干货~手把手教你安装 Visual Studio 安卓模拟器
干货~手把手教你安装 Visual Studio 安卓模拟器 转 http://mini.eastday.com/mobile/171107134734194.html# 今天软妹为大家带来一篇来自M ...
- docker“少折腾”
1.docker镜像加速 新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json ...
- KaliLinuxNetHunter教程刷入第三方Recovery与开始刷机
KaliLinuxNetHunter教程刷入第三方Recovery与开始刷机 2.刷入第三方Recovery(即TWRP) TWRP(TeamWin Recovery Project)是一款XDA大神 ...