【设计模式-06】Observer观察者模式

简要说明

事件处理模型

场景示例:小朋友睡醒了哭,饿!

一、v1版本(披着面向对象的外衣的面向过程)

/*** @description: 观察者模式-v1版本(披着面向对象的外衣的面向过程)* @author: flygo* @time: 2022/7/18 16:57*/
public class ObserverMain {public static void main(String[] args) {boolean cry = false;if (!cry) {// 进行处理}}
}

二、v2版本(面向对象的傻等)

/*** @description: 观察者模式-v2版本(面向对象的傻等)* @author: flygo* @time: 2022/7/18 16:57*/
public class ObserverMain {public static void main(String[] args) {Child child = new Child();while (!child.isCry()) {try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Observing......");}}
}class Child {private boolean cry = false;public boolean isCry() {return cry;}public void setCry(boolean cry) {this.cry = cry;}public void wakeUp() {System.out.println("Waked Up!Crying.......");}
}

三、v3版本(加入观察者)

/*** @description: 观察者模式-v3版本(加入观察者)* @author: flygo* @time: 2022/7/18 16:57*/
public class ObserverMain {public static void main(String[] args) {Child child = new Child();child.wakeUp();}
}class Dad {public void feed() {System.out.println("Dad feeding...");}
}class Child {private boolean cry = false;private Dad dad = new Dad();public boolean isCry() {return cry;}public void setCry(boolean cry) {this.cry = cry;}public void wakeUp() {cry = true;dad.feed();}
}

四、v4版本(加入多个观察者)

/*** @description: 观察者模式-v4版本(加入多个观察者)* @author: flygo* @time: 2022/7/18 16:57*/
public class ObserverMain {public static void main(String[] args) {Child child = new Child();child.wakeUp();}
}class Dad {public void feed() {System.out.println("Dad feeding...");}
}class Mum {public void hug() {System.out.println("Mum hugging...");}
}class Dog {public void wang() {System.out.println("dog wang...");}
}class Child {private boolean cry = false;private Dad dad = new Dad();private Mum mum = new Mum();private Dog dog = new Dog();public boolean isCry() {return cry;}public void setCry(boolean cry) {this.cry = cry;}public void wakeUp() {cry = true;dad.feed();mum.hug();dog.wang();}
}

五、v5版本(加入多个观察者,采用接口的实现方式)

/*** @description: 观察者模式-v5版本(加入多个观察者,采用接口实现的方式)* @author: flygo* @time: 2022/7/18 16:57*/
public class ObserverMain {public static void main(String[] args) {Child child = new Child();child.wakeUp();}
}interface Observer {void actionOnWakeUp();
}class Dad implements Observer {public void feed() {System.out.println("Dad feeding...");}@Overridepublic void actionOnWakeUp() {feed();}
}class Mum implements Observer {public void hug() {System.out.println("Mum hugging...");}@Overridepublic void actionOnWakeUp() {hug();}
}class Dog implements Observer {public void wang() {System.out.println("dog wang...");}@Overridepublic void actionOnWakeUp() {wang();}
}class Child {private boolean cry = false;private List<Observer> observerList = new ArrayList<>();{observerList.add(new Dad());observerList.add(new Mum());observerList.add(new Dog());}public boolean isCry() {return cry;}public void setCry(boolean cry) {this.cry = cry;}public void wakeUp() {cry = true;for (Observer o : observerList) {o.actionOnWakeUp();}}
}

六、v6版本(加入多个观察者,增加事件对象)

import java.util.ArrayList;
import java.util.List;/*** @description: 观察者模式-v5版本(加入多个观察者,增加事件对象)* @author: flygo* @time: 2022/7/18 16:57*/
public class ObserverMain {public static void main(String[] args) {Child child = new Child();child.wakeUp();}
}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 Dad implements Observer {public void feed() {System.out.println("Dad feeding...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {feed();}
}class Mum implements Observer {public void hug() {System.out.println("Mum hugging...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {hug();}
}class Dog implements Observer {public void wang() {System.out.println("dog wang...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {wang();}
}class Child {private boolean cry = false;private List<Observer> observerList = new ArrayList<>();{observerList.add(new Dad());observerList.add(new Mum());observerList.add(new Dog());}public boolean isCry() {return cry;}public void setCry(boolean cry) {this.cry = cry;}public void wakeUp() {cry = true;WakeUpEvent event = new WakeUpEvent(System.currentTimeMillis(), "bed");for (Observer o : observerList) {o.actionOnWakeUp(event);}}
}

七、v7版本(加入多个观察者,增加事件对象且时间对象增加事件源)

import java.util.ArrayList;
import java.util.List;/*** @description: 观察者模式-v5版本(加入多个观察者,增加事件对象且事件对象增加事件源)* @author: flygo* @time: 2022/7/18 16:57*/
public class ObserverMain {public static void main(String[] args) {Child child = new Child();child.wakeUp();}
}interface Observer {void actionOnWakeUp(WakeUpEvent event);
}class Dad implements Observer {public void feed() {System.out.println("Dad feeding...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {feed();}
}class Mum implements Observer {public void hug() {System.out.println("Mum hugging...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {hug();}
}class Dog implements Observer {public void wang() {System.out.println("dog wang...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {wang();}
}class WakeUpEvent {long timestamp;String loc;Child child;public WakeUpEvent(long timestamp, String loc, Child child) {this.timestamp = timestamp;this.loc = loc;this.child = child;}
}class Child {private boolean cry = false;private List<Observer> observerList = new ArrayList<>();{observerList.add(new Dad());observerList.add(new Mum());observerList.add(new Dog());}public boolean isCry() {return cry;}public void setCry(boolean cry) {this.cry = cry;}public void wakeUp() {cry = true;WakeUpEvent event = new WakeUpEvent(System.currentTimeMillis(), "bed", this);for (Observer o : observerList) {o.actionOnWakeUp(event);}}
}

八、v8版本(加入多个观察者,事件体系)

import java.util.ArrayList;
import java.util.List;/*** @description: 观察者模式-v5版本(加入多个观察者,事件体系)* @author: flygo* @time: 2022/7/18 16:57*/
public class ObserverMain {public static void main(String[] args) {Child child = new Child();child.wakeUp();}
}interface Observer {void actionOnWakeUp(WakeUpEvent event);
}class Dad implements Observer {public void feed() {System.out.println("Dad feeding...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {feed();}
}class Mum implements Observer {public void hug() {System.out.println("Mum hugging...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {hug();}
}class Dog implements Observer {public void wang() {System.out.println("dog wang...");}@Overridepublic void actionOnWakeUp(WakeUpEvent event) {wang();}
}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;}@OverrideChild getSource() {return source;}
}class Child {private boolean cry = false;private List<Observer> observerList = new ArrayList<>();{observerList.add(new Dad());observerList.add(new Mum());observerList.add(new Dog());}public boolean isCry() {return cry;}public void setCry(boolean cry) {this.cry = cry;}public void wakeUp() {cry = true;WakeUpEvent event = new WakeUpEvent(System.currentTimeMillis(), "bed", this);for (Observer o : observerList) {o.actionOnWakeUp(event);}}
}

九、v9版本(java原生awt button使用的观察模式和模拟原生awt Button实现观察者模式)

1、java原生awt button使用的观察模式

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @description: 简单的一个按钮点击小例子演示java原生使用的观察者模式* @author: flygo* @time: 2022/7/19 10:20*/
public class TestFrame extends Frame {public void launch() {Button button = new Button("press me");button.addActionListener(new MyButtonActionListener());button.addActionListener(new MyButtonActionListener2());this.add(button);this.pack();this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {super.windowClosing(e);System.exit(0);}});this.setLocation(400, 400);this.setVisible(true);}public static void main(String[] args) {new TestFrame().launch();}
}class MyButtonActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {((Button) e.getSource()).setLabel("press me again!");System.out.println("button pressed!");}
}class MyButtonActionListener2 implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("button pressed again!");}
}

2、模拟原生awt Button实现观察者模式

核心思路和逻辑

  • 定义事件类ActionEvent
  • 定义接口类 ActionListener和接口方法 void actionPerformed(ActionEvent e);
  • 自定义Button类,模拟按钮点击事件

  • 自定义监听者 MyActionEventListenerMyActionEventListener2实现接口 void actionPerformed(ActionEvent e);

  • main主方法程序Button添加监听者MyActionEventListenerMyActionEventListener2, 模拟Button调用点击方法buttonPressed

import java.util.ArrayList;
import java.util.List;/*** @description: 模拟Java原生awt button观察者模式* @author: flygo* @time: 2022/7/19 11:09*/
public class ButtonObserverMain {public static void main(String[] args) {Button button = new Button();button.addActionListener(new MyActionEventListener());button.addActionListener(new MyActionEventListener2());button.buttonPressed();}
}interface ActionListener {void actionPerformed(ActionEvent e);
}class ActionEvent {long when;Object source;public ActionEvent(long when, Object source) {this.when = when;this.source = source;}public long getWhen() {return when;}public Object getSource() {return source;}
}class Button {private List<ActionListener> listenerList = new ArrayList<>();public void buttonPressed() {ActionEvent event = new ActionEvent(System.currentTimeMillis(), this);for (ActionListener listener : listenerList) {listener.actionPerformed(event);}}public void addActionListener(ActionListener listener) {this.listenerList.add(listener);}
}class MyActionEventListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("button pressed!");}
}class MyActionEventListener2 implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("button pressed again!");}
}

十、v10版本(使用Lambda表达式实现回调或钩子函数)

JavaScript 中有钩子函数,其实就是观察者模式

import java.util.ArrayList;
import java.util.List;/*** @description: 模拟Java原生awt button观察者模式-钩子函数(hook)、回调(callback)、observer* @author: flygo* @time: 2022/7/19 11:09*/
public class ButtonObserverMain {public static void main(String[] args) {Button button = new Button();button.addActionListener(new MyActionEventListener());button.addActionListener(new MyActionEventListener2());button.addActionListener((e) -> {System.out.println("This is lambda listener!");});button.buttonPressed();}
}interface ActionListener {void actionPerformed(ActionEvent e);
}class ActionEvent {long when;Object source;public ActionEvent(long when, Object source) {this.when = when;this.source = source;}public long getWhen() {return when;}public Object getSource() {return source;}
}class Button {private List<ActionListener> listenerList = new ArrayList<>();public void buttonPressed() {ActionEvent event = new ActionEvent(System.currentTimeMillis(), this);for (ActionListener listener : listenerList) {listener.actionPerformed(event);}}public void addActionListener(ActionListener listener) {this.listenerList.add(listener);}
}class MyActionEventListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("button pressed!");}
}class MyActionEventListener2 implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("button pressed again!");}
}

十一、JavaScript中的event事件

在很多系统中,Observer模式往往和责任链共同负责对于事件的处理,其中的某一个observer负责是否将事件往下传

<script type="text/javascript">function handle() {alert(event.target.value);}
</script><input type="button" value="press me" name="button" onclick="handle()" />

十二、源码地址

https://github.com/jxaufang168/Design-Patternsicon-default.png?t=N7T8https://github.com/jxaufang168/Design-Patterns


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/239932.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

存储的基本架构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、存储的需求背景二、自下而上存储架构总结 一、存储的需求背景 1、人的身份信息需要存储 这种信息可以用关系型数据库&#xff0c;例如mysql&#xff0c;那种表…

上海亚商投顾:沪指冲高回落 旅游板块全天强势

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落&#xff0c;创业板指跌近1%&#xff0c;北证50指数跌超3%。旅游、零售板块全天强势&#xf…

设计模式⑥ :访问数据结构

文章目录 一、前言二、Visitor 模式1. 介绍2. 应用3. 总结 三、Chain of Responsibility 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书&q…

弟12章 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165TCP服务器端代码的编写 p166TCP服务器端流程 TCP客户端代码的编写 p167TCP客户端流程主机和客户端的通信流程 tcp多次通信服务器端代码 p168TCP多次通信客户端代码 p169UDP的一次双向通信 p170udp通信模型udp接收方代码u…

图像处理------亮度

from PIL import Imagedef change_brightness(img: Image, level: float) -> Image:"""按照给定的亮度等级&#xff0c;改变图片的亮度"""def brightness(c: int) -> float:return 128 level (c - 128)if not -255.0 < level < 25…

python基础学习

缩⼩图像&#xff08;或称为下采样&#xff08;subsampled&#xff09;或降采样&#xff08;downsampled&#xff09;&#xff09;的主要⽬的有两个&#xff1a;1、使得图像符合显⽰区域的⼤⼩&#xff1b;2、⽣成对应图像的缩略图。 放⼤图像&#xff08;或称为上采样&#xf…

如何在 Python3 中使用变量

介绍 变量是一个重要的编程概念&#xff0c;值得掌握。它们本质上是在程序中用于表示值的符号。 本教程将涵盖一些变量基础知识&#xff0c;以及如何在您创建的 Python 3 程序中最好地使用它们。 理解变量 从技术角度来说&#xff0c;变量是将存储位置分配给与符号名称或标…

AI对决:ChatGPT与文心一言的深度比较

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文…

mathtype2024版本下载与安装(mac版本也包含在内)

安装包补丁主要是mathtype的安装包&#xff0c;与它的补丁。 详细安装过程&#xff1a; step1&#xff1a; 使用方法是下载完成后先安装MathType-win-zh.exe文件&#xff0c;跟着步骤走直接安装就行。 step2&#xff1a; 关闭之后&#xff0c;以管理员身份运行MathType7PJ.exe…

Jsqlparser简单学习

文章目录 学习链接模块访问者模式parser模块statement模块Expression模块deparser模块 测试TestDropTestSelectTestSelectVisitor 学习链接 java设计模式&#xff1a;访问者模式 github使用示例参考 测试 JSqlParser使用示例 JSqlParse&#xff08;一&#xff09;基本增删改…

Linux 系统编程:文件系统的底层逻辑 - inode

《Linux 程序设计》的第三章讲文件操作。在提到 目录 时有这么一段文字&#xff1a; 文件&#xff0c;除了本身包含的 内容 以外&#xff0c;它还会有一个 名字 和一些 属性&#xff0c;即“管理信息”&#xff0c;包括文件的创建 / 修改日期和它的访问权限。这些属性被保存在文…

用LED数码显示器伪静态显示数字1234

#include<reg51.h> // 包含51单片机寄存器定义的头文件 void delay(void) //延时函数&#xff0c;延时约0.6毫秒 { unsigned char i; for(i0;i<200;i) ; } void main(void) { while(1) //无限循环 { P20xfe; …

图像分类 | 基于 Labelme 数据集和 VGG16 预训练模型实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要使用数据标注工具 Labelme 对自行车&#xff08;bike&#xff09;和摩托车&#xff08;motorcycle&#xff09;这两种训练样本进行标注&#xff0c;使用预训练模型 VGG16 作为卷积基&#xff0c;并在其之上添加了全连接…

el-date-picker组件设置时间范围限制

需求&#xff1a; 如图所示&#xff0c;下图为新增的一个弹层页面&#xff0c;同时有个需求&#xff0c;日期选择需要限制一个月的时间范围&#xff08;一月默认为30天&#xff09;&#xff1a; 查看官方文档我们需要主要使用到如下表格的一些东西&#xff1a; 参数说明类型可…

FFmpeg之SWScale

文章目录 一、概述二、函数调用结构图三、Libswscale处理数据流程四、重要结构体4.1、SwsContext4.2、SwsFilter 五、重要函数5.1、sws_getContext5.1.1、sws_alloc_context5.1.2、sws_init_context 5.2、sws_scale5.2.1、SwsContext中的swscale()5.2.2、check_image_pointers5…

8个Python必备的PyCharm插件

大家好&#xff0c;在PyCharm中浏览插件列表并尝试很多人推荐的插件后&#xff0c;总结了几个瑰宝插件&#xff0c;它们各自以独特的方式帮助开发者快速、简便、愉悦地开发&#xff0c;接下来将逐个介绍它们。 1. Key Promoter X 【下载链接】&#xff1a;https://plugins.je…

【Python数据可视化】matplotlib之增加图形内容:设置图例、设置中文标题、设置网格效果

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

Vue3+ElementPlus实例_select选择器(不连续搜索)

1.开发需求 在各大UI框架的select选择器中&#xff0c;在搜索时都是输入连续的搜索内容&#xff0c;比如“app-store”选项&#xff0c;你要输入“app-xxx”&#xff0c;才能匹配这个选择&#xff0c;要是想输入“a-s”这种不连续的匹配方式&#xff0c;就实现不了&#xff0c…

电脑安装 Python提示“api-ms-win-crt-process-l1-1-0.dll文件丢失,程序无法启动”,快速修复方法,完美解决

在windows 10系统安装完python后&#xff0c;启动的时候&#xff0c;Windows会弹出错误提示框“无法启动此程序&#xff0c;因为计算机中丢失了api-ms-win-crt-process-l1-1-0.dll&#xff0c;尝试重新安装该程序以解决此问题。” api-ms-win-crt-process-l1-1-0.dll是一个动态…

软件架构之事件驱动架构

一、定义 事件驱动的架构是围绕事件的发布、捕获、处理和存储&#xff08;或持久化&#xff09;而构建的集成模型。 某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时&#xff0c;就会发布一个事件&#xff08;也就是对该操作或更改的记录&#xff09;&am…