设计模式之观察者模式

使用JavaScript获取设备的唯一ID 在JavaScript中,我们可以使用不同的方法获取设备的唯一ID。这个唯一ID可以用于识别设备、跟踪用户或进行其他设备相关的操作。下面是一种常见的方法来获取设备的唯一ID。中的,如果用户清除了浏览器的缓存或使用隐私模式访问网站,设备ID可能会丢失。因此,在使用设备ID进行重要操作时,最好采取其他更可靠的方法来确保唯一性。这种方法的优点是简单且快速,但并不是完全唯一的。请注意,由于浏览器的安全性限制,JavaScript无法直接访问设备的硬件信息来获取唯一ID。需要注意的是,由于设备ID是存储在。 阅读详情

定义

        观察者模式(Observer Pattern)定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新,属于行为型模式。观察者模式有时也叫做发布订阅模式。观察者模式主要用于在关联行为之间建立一套触发机制的场景。


适用场景

我们经常看到微信朋友圈的动态通知、邮件通知等

实例

我们来实现下java.awt.Event,简单的模拟下

创建Event类

public class Event {    //事件源,事件是由谁发起的保存起来    private Object source;    //事件触发,要通知谁    private Object target;    //事件触发,要做什么动作,回调    private Method callback;    //事件的名称,触发的是什么事件    private String trigger;    //事件触发的时间    private long time;​    public Event(Object target, Method callback) {        this.target = target;        this.callback = callback;    }​    public Event setSource(Object source) {        this.source = source;        return this;    }​    public Event setTime(long time) {        this.time = time;        return this;    }​    public Object getSource() {        return source;    }​    public Event setTrigger(String trigger) {        this.trigger = trigger;        return this;    }​    public long getTime() {        return time;    }​    public Object getTarget() {        return target;    }​    public Method getCallback() {        return callback;    }​    @Override    public String toString() {        return "Event{" + "\n" +                "\tsource=" + source.getClass() + ",\n" +                "\ttarget=" + target.getClass() + ",\n" +                "\tcallback=" + callback + ",\n" +                "\ttrigger='" + trigger + "',\n" +                "\ttime=" + time + "'\n" +                '}';    }}

创建 EventLisenter 类,监听器,我们可以认为他是观察者

public class EventLisenter {​    //JDK底层的Lisenter通常也是这样来设计的    protected Map<String,Event> events = new HashMap<String,Event>();​    //事件名称和一个目标对象来触发事件    public void addLisenter(String eventType,Object target){        try {            this.addLisenter(                    eventType,                    target,                    target.getClass().getMethod("on" + toUpperFirstCase(eventType),Event.class));        }catch (Exception e){            e.printStackTrace();        }    }​    public void addLisenter(String eventType,Object target,Method callback){        //注册事件        events.put(eventType, new Event(target, callback));    }​​    //触发,只要有动作就触发    private void trigger(Event event) {        event.setSource(this);        event.setTime(System.currentTimeMillis());​        try {            //发起回调            if(event.getCallback() != null){                //用反射调用它的回调函数                event.getCallback().invoke(event.getTarget(),event);            }        } catch (Exception e) {            e.printStackTrace();        }    }​    //事件名称触发    protected void trigger(String trigger){        if(!this.events.containsKey(trigger)){return;}        trigger(this.events.get(trigger).setTrigger(trigger));    }​    //逻辑处理的私有方法,首字母大写    private String toUpperFirstCase(String str){        char[] chars = str.toCharArray();        chars[0] -= 32;        return String.valueOf(chars);    }​}

创建鼠标类型类

public interface MouseEventType {    //单击    String ON_CLICK = "click";​    //双击    String ON_DOUBLE_CLICK = "doubleClick";​    //弹起    String ON_UP = "up";​    //按下    String ON_DOWN = "down";​    //移动    String ON_MOVE = "move";​    //滚动    String ON_WHEEL = "wheel";​    //悬停    String ON_OVER = "over";​    //失焦    String ON_BLUR = "blur";​    //获焦    String ON_FOCUS = "focus";}

创建鼠标类

public class Mouse extends EventLisenter {​    public void click(){        System.out.println("调用单击方法");        this.trigger(MouseEventType.ON_CLICK);    }​    public void doubleClick(){        System.out.println("调用双击方法");        this.trigger(MouseEventType.ON_DOUBLE_CLICK);    }​    public void up(){        System.out.println("调用弹起方法");        this.trigger(MouseEventType.ON_UP);    }​    public void down(){        System.out.println("调用按下方法");        this.trigger(MouseEventType.ON_DOWN);    }​    public void move(){        System.out.println("调用移动方法");        this.trigger(MouseEventType.ON_MOVE);    }​    public void wheel(){        System.out.println("调用滚动方法");        this.trigger(MouseEventType.ON_WHEEL);    }​    public void over(){        System.out.println("调用悬停方法");        this.trigger(MouseEventType.ON_OVER);    }​    public void blur(){        System.out.println("调用获焦方法");        this.trigger(MouseEventType.ON_BLUR);    }​    public void focus(){        System.out.println("调用失焦方法");        this.trigger(MouseEventType.ON_FOCUS);    }}

创建回调方法类

public class MouseEventCallback {​    public void onClick(Event e){        System.out.println("===========触发鼠标单击事件==========" + "\n" + e);    }​    public void onDoubleClick(Event e){        System.out.println("===========触发鼠标双击事件==========" + "\n" + e);    }​    public void onUp(Event e){        System.out.println("===========触发鼠标弹起事件==========" + "\n" + e);    }​    public void onDown(Event e){        System.out.println("===========触发鼠标按下事件==========" + "\n" + e);    }​    public void onMove(Event e){        System.out.println("===========触发鼠标移动事件==========" + "\n" + e);    }​    public void onWheel(Event e){        System.out.println("===========触发鼠标滚动事件==========" + "\n" + e);    }​    public void onOver(Event e){        System.out.println("===========触发鼠标悬停事件==========" + "\n" + e);    }​    public void onBlur(Event e){        System.out.println("===========触发鼠标失焦事件==========" + "\n" + e);    }​    public void onFocus(Event e){        System.out.println("===========触发鼠标获焦事件==========" + "\n" + e);    }​}​

客户端测试类

public static void main(String[] args) {​        MouseEventCallback callback = new MouseEventCallback();​        Mouse mouse = new Mouse();​        //@谁?@回调方法        mouse.addLisenter(MouseEventType.ON_CLICK,callback);        mouse.addLisenter(MouseEventType.ON_FOCUS,callback);​        mouse.click();​        mouse.focus();​​    }

当然了,我们可以用一个开发好的框架guava实现观察者模式,api非常简单,使用如下:

引入maven依赖

 <dependency>            <groupId>com.google.guava</groupId>            <artifactId>guava</artifactId>            <version>20.0</version>        </dependency>

创建侦听事件GuavaEvent

public class GuavaEvent {​    @Subscribe    public void subscribe(String str){        System.out.println("执行subscribe方法,传入的参数是:" + str);    }​}​

测试类

public static void main(String[] args) {        //消息总线        EventBus eventBus = new EventBus();        GuavaEvent guavaEvent = new GuavaEvent();        eventBus.register(guavaEvent);        eventBus.post("Elvis");    }

 

 

优点

1、观察者和被观察者之间建立了一个抽象的耦合。 

2、观察者模式支持广播通信。

 

缺点

1、观察者之间有过多的细节依赖、提高时间消耗及程序的复杂度。 

2、使用要得当,要避免循环调用。​

用js获取电脑信息(是使用与IE浏览器) 用js获取本地电脑信息(但是只能在IE浏览器下才行,其他浏览器其获取不到的): 代码如下: <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title>ieT 立即下载

相关推荐

告别手动维护!教你用SAP BAPI批量更新生产订单BOM组件(CO02工单)

本文详细介绍了如何利用SAP BAPI实现生产订单BOM组件的批量更新,解决传统手工操作(如CO02工单)效率低下的问题。通过核心函数解析和批量处理框架设计,帮助用户大幅提升工作效率,降低错误率,适用于物料主数据变更、季节性配方调整等场景。

weixin_30844577的博客 561

js 获取设备或浏览器唯一标识的方式

js 获取设备或浏览器唯一标识的方式。

君子不卿 3828

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 743

JS生成浏览器唯一标识解决方案

浏览器唯一摘要

gltncx11的博客 1万+

泰山派RK3576开发板部署Qwen3-VL-4B多模态模型实战指南:从模型转换到板端推理全流程

本文提供了在泰山派RK3576开发板上部署阿里Qwen3-VL-4B多模态模型的完整实战指南。详细介绍了从环境准备、模型转换(包括视觉模型转换为.rknn格式和语言模型转换为.rkllm格式)、交叉编译到板端推理的全流程,重点讲解了如何利用RK3576的NPU进行硬件加速,实现高效的边缘AI应用。

weixin_30356433的博客 257

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 109

js获取当前设备的唯一标识

【代码】js获取当前设备的唯一标识。

廖圣平 1812

AD | Altium Designer(原理图设计、电路仿真、PCB绘图)汉化版

Altium Designer(原理图设计、电路仿真、PCB绘图)

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 4166

设计模式之观察者模式(ObserverPattern)

设计模式之观察者模式(ObserverPattern) 文章目录设计模式之观察者模式(ObserverPattern)一.观察者模式(ObserverPattern)二.编程实例1.进制转换器2.客人敲门案例 一.观察者模式(ObserverPattern) 在生活中会遇到很多使用观察者模式的案例,比如股票跌涨后,股民作为观察者会对股票进行交易;客人来敲门,门铃响了之后管家就会去开门等等。其中观...

Worthy_Wang的博客 622

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4974

ABAP CDS 实体权限控制,从 DCL 到 PFCG 的完整运行逻辑

本文探讨了SAP S/4HANA开发中CDS View的权限控制机制。核心观点如下: CDS access control通过DCL语言实现数据实例级权限控制,而非替代传统PFCG权限体系,二者形成互补关系:PFCG控制功能入口权限,DCL控制数据可见性。 DDL定义数据结构,DCL定义访问规则。DCL通过角色映射将数据字段与PFCG授权对象关联,运行时自动将权限条件注入SQL查询,实现数据过滤。 访问控制行为特点: 无DCL role不会默认拒绝访问 权限检查通过减少结果集而非抛出错误实现 需配合@Acc

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 101

设计模式之观察者模式ObserverPattern(十一)

观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

徐泗空的博客 1047

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤

Robot_PLC_HMI_Automation 6393

设计模式之ObserverPattern观察者模式

现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。 在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系。所有这些,如果用观察者模式来实现就非常方便。 观察者Observer模式的特点和定义: 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一

haoyuegongzi的博客 326

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

设计模式-观察者模式

观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。本文以AbstractCursor为例子,展开分析。观察者模式,Observer Pattern,是一个很实用的模式,本人曾经接触到的各种平台以及曾经参与项目中打印模板解释器中都用到了此模式。 1.意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知...

weixin_34268843的博客 285

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式-观察者模式-Observer Pattern

观察者模式的优点包括实现了观察者和被观察者之间的解耦,增加了程序的可扩展性,并且可以动态地添加或移除观察者。:观察者模式能够将被观察者(Subject)和观察者(Observer)解耦,使得被观察者的改变不会直接影响到观察者,两者之间的依赖关系降低。:在需要实现通知和消息传递的系统中,观察者模式可以用来通知用户或系统组件关于状态变化的信息,如电子邮件客户端中的新邮件通知。:在观察者模式中,如果一个观察者在更新时发生错误,可能会影响到其他观察者的更新,这需要在设计时考虑错误处理机制。

wesigj的博客 1483

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【24种设计模式】观察者模式(Observer Pattern)

这种模式实现了一种一对多的对象依赖关系,当一个对象的状态改变时,所有依赖它的对象都会得到通知并自动更新。总结起来,观察者模式通过定义主题和观察者之间的接口,实现了一种松耦合的对象间通信方式。观察者模式中,通知观察者的算法骨架是固定的,但具体的通知操作可以由不同的观察者进行实现。在状态模式中,状态的改变会导致行为的改变,而在观察者模式中,状态的改变会导致通知给观察者。发布-订阅模式:发布-订阅模式是观察者模式的一种扩展,它将观察者分组,通过消息队列、事件总线等机制实现观察者与主题之间的松耦合通信。

Bankcary的博客 632

设计模式-观察者模式(Observer Pattern)

观察者模式 定义 观察者模式,又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象。 类型 行为型。 角色 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。 具体主题(Co...

kaven 1451

设计模式——行为型——观察者模式ObserverPattern

https://en.wikipedia.org/wiki/Observer_pattern

bbllbbcpt的专栏 304

设计模式教程:观察者模式(Observer Pattern)

定义对象之间的一对多依赖关系,当一个对象状态变化时,所有依赖于它的对象都会得到通知并自动更新。

遇见伯灵说的博客 1245

c++ 设计模式_设计模式行为型:观察者模式(ObserverPattern)

定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependence)模式。结构图角色与理解观察者模式共分为四种角色: Subject(目标类):被观察的对象,内部定义一个观察者集合,并...

weixin_39974223的博客 110

设计模式之观察者模式(Observer Pattern)

六大原则:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则。 二十三设计模式:单例模式、Builder 模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式

Mr_Four 309

Java 设计模式——观察者模式(Observer Pattern)

    前言 一、简介 二、实现步骤 (1)实现方式: (2)举例: (3)步骤简化版: 三、代码实现 四、总结 五、Demo地址 六、参考文档 七、内容推荐 前言 本来没想写前言的,感觉就是一堆废话。那就当废话浏览一下吧,只是提醒一下自己一些注意的东西。 在许多博客当中看到把观察者模式又称呼为发布-订阅模式。其实我感觉两者确实很相似,但还是有一丢丢的区别: 在...

斌林诚上的博客 726
上一篇: 设计模式之装饰者模式
下一篇: Spring集成RocketMq
JackRenEngineer
博客等级 码龄10年 37粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值