观察者模式基础

以下是小孩哭这个动作,通知所观察者(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. 末学者笔记--NTP服务和DNS服务

    NTP时间服务器 一.概念: 作用:ntp主要是用于对计算机的时间同步管理操作. 时间是对服务器来说是很重要的,一般很多网站都需要读取服务器时间来记录相关信息,如果时间不准,则可能造成很大的影响. 二 ...

  2. 浅析Kubernetes的工作原理

    先放一张Kubernetes的架构图: 整体来看,是一个老大,多个干活的这种结构,基本上所有的分布式系统都是这样,但是里面的组件名称就纷繁复杂,下面将一一解析. 1.元数据存储与集群维护 作为一个集群 ...

  3. Linux NFS服务器的安装与配置方法(图文详解)

    这篇文章主要介绍了Linux NFS服务器的安装与配置方法(图文详解),需要的朋友可以参考下(http://xb.xcjl0834.com) 一.NFS服务简介 NFS 是Network File S ...

  4. WPF使用总结

    ListboxItemContainer样式 一般items控件的项模板 很容易 设置DataTemplate就可以了,比如listbox .但是在选中和失去焦点的时候 却是Windows自带的那种 ...

  5. CentOS Linux搭建SVN服务器

    Linux系统:CentOS 安装步骤如下: 1.yum install subversion 2.输入rpm -ql subversion查看安装位置,如下图: 可以看到 svn在bin目录下生成了 ...

  6. 记录一次大量CLOSE_WAIT的情况

    近期的项目中,有一个特殊的需求,对于每个客户端程序有若干个机构,对于每个机构有不同的客户端证书,程序间隔一段时间向服务端进行请求,根据请求的成功与否更新各机构的状态(如正常,证书未配置,证书过期等). ...

  7. centos7 安装 oh my zsh

    和在ubuntu 下安装十分相似(基本没区别) 安装zsh yum install zsh 改变系统bash chsh -s /bin/zsh git clone oh my zsh 项目: git@ ...

  8. centos查看apache用的是哪个httpd.conf

    httpd -V得到类似如下结果: -D HTTPD_ROOT="/etc/httpd" -D SERVER_CONFIG_FILE="conf/httpd.conf&q ...

  9. hadoop2-HBase的Java API操作

    Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...

  10. Layui下拉框改变时触发事件

    layui.use(['form', 'layer'], function () { var form = layui.form(); var layer = layui.layer; form.on ...