观察者模式基础

以下是小孩哭这个动作,通知所观察者(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反应堆模式的更多相关文章

  1. java设计模式--观察者模式和事件监听器模式

    观察者模式 观察者模式又称为订阅—发布模式,在此模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来事件 ...

  2. java设计模式-观察者模式,装饰者模式

    1.1定义 慨念:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 即:主题和观察者定义了一对多的关系,观察者依赖于主题,只要主题发生变化,观察者就 ...

  3. Java设计模式之《职责链模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ...

  4. Java设计模式之《享元模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...

  5. Java设计模式之《调停者模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6518603.html 调停者模式. 我们想象一下这样的场景:一个系统内部通过许多的类互相之 ...

  6. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  7. Java设计模式之《构建者模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6553374.html 构建者模式,又称建造者模式,将一部负责对象的构建分为许多小对象的构建 ...

  8. Java设计模式(22)命令模式(Command模式)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

  9. Java设计模式(21)访问模式(Visitor者模式)

    Visitor定义:作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元 ...

随机推荐

  1. 论文阅读笔记五十四:Gradient Harmonized Single-stage Detector(CVPR2019)

    论文原址:https://arxiv.org/pdf/1811.05181.pdf github:https://github.com/libuyu/GHM_Detection 摘要 尽管单阶段的检测 ...

  2. python3+Robot Framework+PyCharm自动化测试框架设计

    关于自动化测试框架的设计,笔者在前面的随笔里面有介绍和总结,这里结合实际的项目例子做个demo,环境部署参考笔者的的随笔<python3+Robot Framework+PyCharm环境部署及 ...

  3. ssh-copy-id使用非默认22端口时

    http://blog.sina.com.cn/s/blog_541a3cf10101epzf.html

  4. Java - 数组排序 -- 浅析稳定性与复杂度

    上次我们了解了对数组的基本操作,那么谈到数组,我们就不得不谈谈数组的排序 什么是排序 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列 -- 百度百科 排序是 ...

  5. pwn易忘操作原理笔记

    堆溢出漏洞: 一.null-byte-off-by-one 漏洞原理:由于输入操作失误,导致可以把size最低字节修改为\x00,overlapchunk利用. 构造 1.freeB,此时C的pres ...

  6. PCA:利用PCA(四个主成分的贡献率就才达100%)降维提高测试集辛烷值含量预测准确度并《测试集辛烷值含量预测结果对比》—Jason niu

    load spectra; temp = randperm(size(NIR, 1)); P_train = NIR(temp(1:50),:); T_train = octane(temp(1:50 ...

  7. 结对开发项目--石家庄地铁web版

    一.功能要求 1.数据库设计:将石家庄地铁线路图的各个线路,各个站点,换乘信息等用数据库的形式保存起来,应该保存的信息有 {线路号,线路的各个站名,车站的换乘信息}. 2.站点查询:用户可以输入任一一 ...

  8. [数据结构] 希尔排序 C语言程序

    //由小到大 //希尔排序 void shellSort( long int array[], int length) { int i; int j; int k; int gap; //gap是分组 ...

  9. spring为什么推荐使用构造器注入?

    闲谈 ​ Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由Spr ...

  10. Python爬虫爬取豆瓣读书

    一,准备工作. 工具:win10+Python3.6 爬取目标:爬取图中红色方框的内容. 原则:能在源码中看到的信息都能爬取出来. 信息表现方式:CSV转Excel. 二,具体步骤. 先给出具体代码吧 ...