`

观察者模式(监听器模式)

阅读更多

观察者模式基本概念

 

       观察者模式(Observer),也称发布/订阅模式;

       观察者模式是软件设计模式的一种。在此模式中,一个目标(被观察者)管理所有相依于它的观察者,并且在它本身的状态改变时主动发出通知。这通常通过调用各观察者所提供的方法来实现。

       观察者模式完美的将观察者和被观察的对象分离开。

       面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了系统的可维护性和重用性。

 

观察者模式的实现

 

       观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。

       实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。

       实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。下面详细的描述了这样一种过程:

 

     1、观察者

 

  (Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

 

     2、被观察对象

 

  被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。

 

      3、撤销观察

 

  观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。

 

       观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。

 

 

监听器和监听器模式

 

      监听器是观察者模式的一种实现,监听器模式也就是观察者模式的一种。

       监听器模式是对某种共有操作的监控。当此操作执行时对此操作作相应处理。

包含的元素:

                          1. 要监控的事件定义Event

                          2. 监控该事件的监听器Listener

                          3. 要监控的事件操作Action

                          4. 监控者

       元素的职责:

                          1.定义了要监控事件的事件类型定义,和其它和该事件相关的特殊定义

                          2.监听器,用于对事件发生后要执行操作的接口定义

                          3.要监控的事件、操作,对于要监控的事件,他必须要包含被监控事件的注册功能

                          4.监控者要实现要监控的事件接口,完成时间发生后的操作内容

       这里举一个例子,说明监听模式的一般实现:

 

       1、首先要定义事件,监听器处理哪些类型的事件,也就是用什么样的事件来触发监听器,事件的类型很多,这里可以定义一个事件接口来抽象所有事件类型。

 

 

Java代码  收藏代码
  1. /** 
  2.  * 事件接口,其中事件的类型定义了三种,创建、删除、更新 
  3.  */  
  4. public interface MyEvent {  
  5.       
  6.     public static final String createEvent = "CREATE_EVENT";  
  7.     public static final String deleteEvent = "DELETE_EVENT";  
  8.     public static final String updateEvent = "UPDATE_EVENT";  
  9.   
  10.     public String getEvent();  
  11.       
  12. }  

 

 

2、给出一个监听器的接口

 

 

Java代码  收藏代码
  1. /** 
  2.  * 定义监听器,该监听器只监听MyEvent类型的事件 
  3.  */  
  4. public interface MyListener {  
  5.     public void handle(MyEvent myEvent);  
  6. }  

 

 

3、监听器的实现,该实现根据事件类型的不同做不同的处理

 

 

Java代码  收藏代码
  1. public class MyListenerImpl implements MyListener {  
  2.     public void handle(MyEvent myEvent) {  
  3.         if(myEvent.getEvent().equals("CREATE_EVENT")){  
  4.             System.out.println("myListener get a create event!");  
  5.         }  
  6.         else if(myEvent.getEvent().equals("DELETE_EVENT")){  
  7.              ...   
  8.         }  
  9.          ...   
  10.     }  
  11. }  

 

 

4、有了监听器的实现,肯定需要一个事件的实现,不过事件的实现类可以是专指某个类型的pojo,也可以是一个事件类型在使用时被设置的类,下面的实现是第一种,直接定义了一个create事件的实现类。

 

 

Java代码  收藏代码
  1. public class MyCreateEventImpl implements MyEvent {  
  2.     private String type="";  
  3.     public MyCreateEventImpl(){  
  4.         this.type = MyEvent.createEvent;  
  5.     }  
  6.     public String getEvent() {  
  7.         return this.type;  
  8.     }  
  9. }  

 

 

5、基础工作都做好后,就可以在想添加监听的类中实施监听功能了。

 

 

Java代码  收藏代码
  1. public class MyCreateAction {  
  2.     //引入监听器  
  3.     private MyListener myListener;  
  4.     //引入事件,用来传给Listener进行处理  
  5.     private static MyEvent myEvent;  
  6.     public void setListener(MyListener myListener){  
  7.         this.myListener = myListener;  
  8.     }  
  9.     private void handleListener(MyEvent myEvent){  
  10.         //触发监听  
  11.         this.myListener.handle(myEvent);  
  12.     }  
  13.     public void execute(){  
  14.         //设置事件的类型为create  
  15.         myEvent = new MyCreateEventImpl();  
  16.         System.out.println("create start!");  
  17.         this.handleListener(myEvent);  
  18.         System.out.println("create end!");  
  19.     }  
  20.   
  21.     //调用被监听的类,测试监听效果  
  22.     public static void main(String[] args) {  
  23.         MyCreateAction action = new MyCreateAction();  
  24.         MyListenerImpl myListener = new MyListenerImpl();  
  25.         //设置监听器的实现  
  26.         action.setListener(myListener);  
  27.         action.execute();  
  28.     }  
  29. }  

 

 

输出的结果为:

 

create start!

myListener get a create event!

create end!

 

至此,监听器模式的基本工作原理就已经十分清楚了。

有些东西听起来很深奥,只要花时间看一下,再动手实验一把,马上就豁然开朗了~

分享到:
评论

相关推荐

    Android,设计模式,观察者模式

    通过一个小的Android应用,学习一下设计模式之观察者模式;观察者模式定义对象间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。这里演示了通过改变一个数值来改变...

    javascript观察者模式Watch.JS.zip

    以往我们使用javascript实现的观察者模式都是通过使用回调函数配合dom上的event事件来操作的,而“Watch.js”可以为javascript的对象实现观察者模式,监听对象的变化。用麻雀虽小五脏俱全来描述Watch.js比较合适。...

    观察者模式高级应用

    附件是个观察者模式高级应用地demo,实现了事件分发机制,例如当创建一个新用户后,发送创建用户地事件,事件总线里面有对创建用户地事件监听地监听器就会得到相应地执行,比较适合那种当一个对象改变状态,依赖它的...

    java内置观察者模式

    java内置的观察者模式,用于日后复习查阅。

    【动力节点】Javaweb开发视频教程之监听器

    其中包括观察者设计模式、监听器设计模式。第二部分为监听器用法。详细讲解了Servlet相关的八大监听器,并通过两个实际项目应用综合演示了它们的用法。 北京动力节点-05监听器专题-001-设计模式分类北京动力节点-05...

    06-让观察者监听事件(1).html

    观察者模式( Observer ) 迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( ...

    SpringBoot ApplicationListener观察者模式示例

    1. 发布订阅/观察者模型,实现业务之间的解耦。 2.比如新增用户完成需要发短信、记录日志等,这些逻辑堆在新增方法的最后面实在不太合理,而且不易复用。 3.对解耦代码有很大的帮助,比如多种业务场景做完都要插入...

    java事件监听模式实现万能事件总线.zip

    Java简单几个类实现万能事件总线,采用享元模式和监听器模式。 使用方法很简单,直接EventCenter.get()....上面只是举例,很像观察者模式,实际上并非简单的观察者模式,有很多定制化的功能,之间可以代码里的注释。

    设计模式实验报告.rar

    包含策略模式,单件模式,迭代器与组合模式,工厂模式,观察者模式,命令模式,适配器与外观模式,装饰者模式的问题描述,类图,源码,运行截图。

    常用开发模式讲解.zip

    下面介绍几种常用的设计模式,包括单例模式、工厂模式、观察者模式、建造者模式、原型模式、适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和策略模式。 单例模式(Singleton Pattern) 单例模式...

    java观察者模式实现和java观察者模式演化

    观察者模式是经典设计模式中很常用的一种,平常我们看到的监听器,基本上都是采用这种设计模式实现的,这里探讨一下观察者模式的演化

    network-changed-observer:android网络改变了监听器使用观察者模式

    网络改变观察者 android网络改变了监听器使用观察者模式

    java监听器demo

    一个java监听器的实现demo,即观察者设计模式实现

    C#23种设计模式_示例源代码及PDF

    观察者模式: 让多个观察者对象同时监听某一个 观察者模式 观察者模式定义了一种一队多的依赖关系, 主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更 新自己。 20、STATE —...

    laravel 事件/监听器实例代码

    导语 上一篇文章实现了记录用户访问,设计上是有缺陷的,代码紧耦合在中间件。如果后续修改需求,不仅记录 ip、城市,还需要记录数据到新的数据表...以上是事件/监听器、观察者模式的简要说明。结合这次的需求理解,当

    深入探索Spring事件监听机制:技术与应用

    这种机制基于观察者模式,由事件(ApplicationEvent)、事件监听器(ApplicationListener)和事件广播器(ApplicationEventMulticaster)三个主要组成部分构成。 事件是发生的动作或事情,其核心是ApplicationEvent...

    Activiti 5.15 用户手册

    1. 简介 协议 下载 源码 必要的软件 JDK 6+ Eclipse Indigo 和 Juno ...事件监听器实现 ...在运行阶段添加监听器 为流程定义添加监听器 通过API分发事件 支持的事件类型 附加信息 4. Activiti API......

    做好的事件监听器1

    做好的事件监听器1

Global site tag (gtag.js) - Google Analytics