`
wade6
  • 浏览: 274255 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多

      以前学习过《设计模式》,现在已经忘得差不多了,虽然知道一些模式的作用和意义,但是对他们的具体实现和应用场景不甚了解,故将工作中遇到的一些模式整理一下,加深理解。

 

观察者模式基本概念

 

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

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

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

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

 

观察者模式的实现

 

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

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

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

 

     1、观察者

 

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

 

     2、被观察对象

 

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

 

      3、撤销观察

 

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

 

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

 

 

监听器和监听器模式


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

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

包含的元素:

                          1. 要监控的事件定义Event

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

                          3. 要监控的事件操作Action

                          4. 监控者

       元素的职责:

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

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

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

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

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

 

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

 

 

/**
 * 事件接口,其中事件的类型定义了三种,创建、删除、更新
 */
public interface MyEvent {
    
    public static final String createEvent = "CREATE_EVENT";
    public static final String deleteEvent = "DELETE_EVENT";
    public static final String updateEvent = "UPDATE_EVENT";

    public String getEvent();
    
}

 

 

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

 

 

/**
 * 定义监听器,该监听器只监听MyEvent类型的事件
 */
public interface MyListener {
    public void handle(MyEvent myEvent);
}
 

 

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

 

 

public class MyListenerImpl implements MyListener {
    public void handle(MyEvent myEvent) {
        if(myEvent.getEvent().equals("CREATE_EVENT")){
            System.out.println("myListener get a create event!");
        }
        else if(myEvent.getEvent().equals("DELETE_EVENT")){
             ... 
        }
         ... 
    }
}
 

 

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

 

 

public class MyCreateEventImpl implements MyEvent {
    private String type="";
    public MyCreateEventImpl(){
        this.type = MyEvent.createEvent;
    }
    public String getEvent() {
        return this.type;
    }
}
 

 

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

 

 

public class MyCreateAction {
    //引入监听器
    private MyListener myListener;
    //引入事件,用来传给Listener进行处理
    private static MyEvent myEvent;
    public void setListener(MyListener myListener){
        this.myListener = myListener;
    }
    private void handleListener(MyEvent myEvent){
        //触发监听
        this.myListener.handle(myEvent);
    }
    public void execute(){
        //设置事件的类型为create
        myEvent = new MyCreateEventImpl();
        System.out.println("create start!");
        this.handleListener(myEvent);
        System.out.println("create end!");
    }

    //调用被监听的类,测试监听效果
    public static void main(String[] args) {
        MyCreateAction action = new MyCreateAction();
        MyListenerImpl myListener = new MyListenerImpl();
        //设置监听器的实现
        action.setListener(myListener);
        action.execute();
    }
}
 

 

输出的结果为:

 

create start!

myListener get a create event!

create end!

 

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

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

 

 

 

分享到:
评论
2 楼 wade6 2012-12-24  
瓶鱼跃 写道
楼主写的不错,不过execute()方法应该是根据不同的event封装不同的event对象,就是这里:
public void execute(){ 
        //设置事件的类型为create 
        myEvent = new MyCreateEventImpl(); 
        System.out.println("create start!"); 
        this.handleListener(myEvent); 
        System.out.println("create end!"); 
    } 

我想楼主应该也是这个意思,只是这里没有描述清楚

你说的没错,
有些情况下需要根据不同的逻辑构造不同的event方法,
达到逻辑监听的功能;
我这里写的只是一个简单的例子,
对execute方法只做create一种事件监听,
逻辑复杂的话可以随意扩展。
1 楼 瓶鱼跃 2012-12-19  
楼主写的不错,不过execute()方法应该是根据不同的event封装不同的event对象,就是这里:
public void execute(){ 
        //设置事件的类型为create 
        myEvent = new MyCreateEventImpl(); 
        System.out.println("create start!"); 
        this.handleListener(myEvent); 
        System.out.println("create end!"); 
    } 

我想楼主应该也是这个意思,只是这里没有描述清楚

相关推荐

    设计模式-观察者

    7. **其他变体**:除了基本的观察者模式,还有复合观察者模式,允许一个观察者对象包含多个观察者,以及异步观察者模式,通知过程在不同的线程中执行,以避免阻塞主线程。 在实际开发中,理解并熟练运用观察者模式...

    设计模式:观察者模式java和javabean

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...

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

    观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    观察者模式最佳实践

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

    观察者模式java实现观察者设计模式

    在Java中,我们可以利用Java提供的内置监听器机制来实现观察者模式,例如`ApplicationListener`和`ApplicationEvent`,这两个类主要用于Swing或JavaFX应用程序中的事件处理。 首先,我们来看`ApplicationListener`...

    c++观察者模式实例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在C++中,这种模式经常用于游戏开发,特别是在像cocos2d-x这样的2D游戏引擎...

    java23种设计模式之观察者模式

    观察者模式有多种变体,如发布/订阅模式、模型-视图-控制器(MVC)架构中的模型与视图之间的关系,以及Java的事件监听机制等。 综上所述,观察者模式是软件设计中的重要工具,它通过引入一种间接的依赖关系,使得...

    IOS 观察者模式实例Demo

    在这个“IOS 观察者模式实例Demo”中,我们将深入探讨如何在iOS应用中实现观察者模式,并通过实际的代码示例来理解其工作原理。 首先,观察者模式的主要角色有两个:主题(Subject)和观察者(Observer)。主题是被...

    观察者模式学习

    除了标准实现,还有很多其他语言和框架提供了观察者模式的支持,例如在C#中,可以使用System.ComponentModel.INotifyPropertyChanged接口来实现,而在JavaScript中,可以通过事件监听器或者发布/订阅模式来实现类似...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    例如,在Web开发中,可以使用观察者模式处理用户交互事件,当用户触发某个操作时,相关的监听器(观察者)会得到通知并执行相应的逻辑。 总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助...

    观察者模式Observer

    观察者模式(Observer)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用于事件处理和实时...

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

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

    Android观察者模式设计思想

    这些接口实现了观察者模式,当用户触发特定事件时,监听器会接收到通知并执行相应的回调方法。开发者可以通过实现这些接口,为UI组件添加交互功能。 4. **LiveData与ViewModel**: 在Android架构组件中,LiveData是...

    观察者模式与JavaBeans事件

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,这种模式被广泛应用于事件处理,例如JavaBeans事件。 JavaBeans...

    观察者模式下载2进阶篇

    观察者模式下载2进阶篇主要探讨了如何利用观察者模式来实现一个高效且灵活的下载功能,并结合自定义View来展示下载进度。这个实践项目不仅涵盖了设计模式的应用,还涉及了Android UI自定义和多线程下载的技术,对...

    观察者模式设计

    ### 观察者模式设计详解 #### 概述 观察者模式是一种常用的设计模式,用于定义对象间的依赖关系。...在框架开发中,事件监听器也是观察者模式的具体体现。掌握观察者模式对于提高软件设计的质量和灵活性具有重要意义。

    Android监听——回调模式与观察者模式

    在Android中,最常见的观察者模式应用是BroadcastReceiver(广播接收器)。BroadcastReceiver可以监听系统或者自定义的广播事件,当特定的广播事件发生时,BroadcastReceiver的onReceive()方法会被调用,开发者在...

    C# 观察者模式实例

    观察者模式是软件设计模式中的一种行为模式,它在面向对象编程中扮演着重要的角色...在ASP.NET开发中,观察者模式可以应用于用户界面的实时更新、数据库更改监听等多个场景,极大地提高了应用程序的响应性和用户体验。

    js观察者模式列子js观察者模式列子

    JavaScript 观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这个模式在JavaScript中广泛应用于事件处理和实时数据同步...

    观察者模式在Java事件处理中的应用研究.pdf

    AWT事件处理机制使用观察者模式来处理事件,事件源(Event Source)作为被观察者,事件监听器(EventListener)作为观察者,事件监听器在事件源状态发生变化时被通知,并执行相应的操作。 本文还将讨论三种使用观察...

Global site tag (gtag.js) - Google Analytics