观察者模式基础

以下是小孩哭这个动作,通知所观察者(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. 《剑指offer》数字在排序数组中出现的次数

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  2. Docker使用docker-compose.yml构建Asp.Net Core和Mysql镜像并与Mysql数据库通信

    version: '3' services: mycore01: build: context: .   container_name: 'mycore01'   #自定义容器名 dockerfile ...

  3. .NET英文技术文章导读(2017-02-09)

    关键字:Docker..NET Core.Apache.ASP.NET Core.Logic App.C#7..NET Standard   使用Docker和.NET Core构建DockNetFi ...

  4. android studio 虚拟机adb.exe已停止工作的处理

    在搭建完android studio 后使用虚拟机或真机调试程序,出现如下错误.   在运行里输入cmd,打开命令行工具,使用netstat -aon|findstr 5037查看adb.exe的50 ...

  5. 【数据结构】KMP算法

    我还是不太懂... 转2篇大神的解释    1>https://www.cnblogs.com/yjiyjige/p/3263858.html     2>https://blog.csd ...

  6. ImCash:币圈英文术语大全

    近年来随着数字货币的火热,在全世界范围内涌现出了一群数字货币的“发烧友”和忠实投资者,他们形成了自己的圈子“币圈”,并且有了自己的文化和语言,今天就让我们一起来了解一下外国币圈有哪些有意思的英文“专用 ...

  7. Mac安装sqlite3

    1,下载最新版本的 Mac OS X 会预安装 SQLite,但是如果没有可用的安装,只需按照如下步骤进行: 去安装最新的3.8.6版本,和linux的sqlite3安装版本是同一个. 软件地址为:h ...

  8. 3dmax 3dmax计算机要求 3dmax下载

    渲染首先是要X64兼容台式电脑,笔记本不行,笔记本就是学生拿来玩还行,渲染大图笔记本真的是发热. 配置一般的电脑和笔记本千万不要尝试安装3dmax2019了,很卡的,3dmax2019只有64位,没有 ...

  9. 黑洞版视频裂变程序【接口版】全新上线,全新UI,支持分享数据统计

    黑洞版视频裂变程序[接口版]全新上线,全新UI,支持分享数据统计!   后台效果   程序统一售价:1899/套(包安装,包更新) 注:本程序不属于之前视频程序的更新版,展现形式和广告位设置均不同,是 ...

  10. 把网站打包快速在线生成ios app的正确方法

    下方的内容不用看了,请点这里 !点这里!IOS APP自助生成系统已上线,请马上去了解下: http://www.tao-jiujiu.com/post/188.html  ============= ...