研究了一下java Event机制 和observer设计模式,发现两者都者不多,一样的原因
java Event机制不过是observer设计模式的一个特例。
一 、observer设计模式
Data类:
package event; public class MyData { public MyData(String name, int age) { this.username = name; this.age = age; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } private String username; private int age; }
EventSource:
package event; public class MyListener { public void onMyEvent(MyEvent event) { System.out.println(" event data . name is : "+ event.getSource().getUsername()); } }
Event:
package event; public class MyEvent{ private MyData source; public MyEvent(MyData source) { this.setSource(source); } public MyData getSource() { return source; } public void setSource(MyData source) { this.source = source; } /** * */ private static final long serialVersionUID = 1L; }
Listener:
package event; public class MyListener { public void onMyEvent(MyEvent event) { System.out.println(" event data . name is : "+ event.getSource().getUsername()); } }
Test类:
package event; public class TestEvent { /** * @param args */ public static void main(String[] args) { EventSource es = new EventSource(); MyData customData = new MyData("Robert",27); MyEvent eo = new MyEvent(customData); MyListener cl = new MyListener(); es.addEventListener(cl); es.changeSource(eo); } }
总结:
对于observer设计模式,我们大致要建立4个类:
MyData类用来存放数据
MyEvent类用来表示事件
EventSource类用来表示事件源
MyListener类用来表示事件监听器
EventSource相对复杂一点,其他类都是很简单的。当然,我们也可以把逻辑处理搬到其他地方去,不过那样的花,这个恐怕就不是observer设计模式了吧!
理解之后发现原理十分简单,只是一个小小track而已!
二 、java提供的Event机制
如果是java的事件机制,原理也差不多,但是,jdk就已经提供了一些类了:
EventObject 事件对象,包含事件对应的数据,需要自定义类继承拓展它
EventListener事件监听器,需要自定义类继承拓展它
—— 不,这只是sun的建议,其实我们完全可以不考虑EventObject、EventListener。EventListener只是一个标记接口。EventObject 也只是维护了一个source的变量,提供 getSource方法。几乎没什么用
Observer
Observeable
—— 这两个类才是重要的 Observeable提供一系列很用的方法、Observer也有一个重要的update方法
(当然,其他类还是需要自己编写)
——所以不用这么多的自定义类了——虽然方便,但是可能不是那么灵活...
参考了几篇blog,发现:
http://smurfs.iteye.com/blog/1171962写的啰嗦,甚至可以说是一种错误的写法;
http://rokily.iteye.com/blog/775395也稍显复杂。
我自己写了个简单实现:
1
package com.test.observer; /** * 可以看做业务po,业务逻辑的处理应该在此类中完成 * 需要继承Observable是因为我们用到了java提供的功能 */ public class EventObserveable extends java.util.Observable{ public void action(Object arg) { super.setChanged();// setChanged 是protected方法,必须由本来来调用。。。 super.notifyObservers(arg); } public void logicHandler(String name) { // ... logic handle here , like : System.out.println("Object arg is :" + name); } }
2
package com.test.observer; import java.util.Observable; import java.util.Observer; /** * 观察者, 此update方法自动由Observer类调用, * * 而 update方法主要是调用 业务方法, 当然,我们也可以在这个方法中直接的业务逻辑处理, 而不用调来调去 * * 需要继承Observer是因为 它是和Observable配套使用的 */ public class EventObserver implements Observer { @Override public void update(Observable o, Object arg) { ((EventObserveable)o).logicHandler(arg.toString()); //System.out.println("Object arg is :" + arg); } }
3
package com.test.observer; import java.util.Observer; /** * 此类可以 看做 事件源, 因为notifyEvent 就是发送事件的源头 EXACTLY! 专供外部调用, 同时 notifyEvent 也是事件处理回调函数 * 此类中,我们需要保持一个Observeable的对象,它来代替我们一部分工作 * 当然,首先要 完成 监听器的 添加、移除 等监听器相关操作 * ———— 当然,我们可以有其他方式添加监听器(参:http://rokily.iteye.com/blog/775395),但是把addEventListener放在这个累里面感觉比较直接 * 此类只是简单实现,实际中我们需要完善其功能,可以写的很复杂 ! */ public class EventSource { private EventObserveable ob = new EventObserveable(); public void addEventListener(Observer listener) { ob.addObserver(listener); } public void removeEventListener(Observer listener) { ob.deleteObserver(listener); } public void notifyEvent(Object arg) { ob.action(arg); } }
测试类:
package com.test.observer; public class Test { /** * @param args */ public static void main(String[] args) { EventSource ds = new EventSource(); ds.addEventListener(new EventObserver()); ds.notifyEvent("Hello LuK ! "); } }
总共4个类,个个简单。
总结: 看再多的设计模式的书或blog或面试宝典都没用,如果自己不去code不去花时间领会的话;当然如果自己没基础,code了后可能还是不明白。。
相关推荐
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。这个开源项目"Java 设计模式.zip"显然是一个Java编程语言实现的设计模式集合,旨在帮助开发者理解和应用这些模式。...
Java设计模式和架构图是软件开发中的重要概念,它们对于构建高效、可维护的系统至关重要。设计模式是解决常见编程问题的经验总结,而架构图则是系统结构的可视化表示,帮助我们理解和规划系统的整体布局。 首先,...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,我们可以利用Java提供的...
Java的23种设计模式是软件工程中一套经过实践证明的有效解决方案,它们是面向对象编程中的精华,旨在提高代码的可重用性、可维护性和灵活性。这些模式可以帮助开发者更好地组织代码,解决常见问题,并促进团队间的...
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,`java.util.Observable`类和`java.util.Observer`接口就是...
观察者模式是一种行为设计模式,允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,事件处理主要用于图形用户界面(GUI)编程,例如Swing和JavaFX框架,但也可以应用于非...
【JAVA设计模式】 设计模式是软件工程中的一种最佳实践,它是解决特定问题的标准化解决方案,尤其是在面向对象编程中。在JAVA领域,设计模式是开发者必须掌握的重要技能之一,它能够帮助我们编写出更加灵活、可扩展...
Java的23种设计模式是软件工程中的一种经典思想,它们是解决常见编程问题的通用解决方案,被广泛应用于各种复杂的软件开发中。这些模式源于GoF(Gang of Four)的著作《设计模式:可复用面向对象软件的基础》,旨在...
在Java和C#中,设计模式的应用广泛且至关重要。以下将分别介绍部分重要的设计模式,并结合这两种语言的特点进行解析: 1. **单例模式**:保证一个类只有一个实例,并提供全局访问点。在Java中,可以使用枚举实现...
Observer模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者”对象,使得它们能够自动更新自己。这个模式在软件工程中扮演着重要的角色,尤其是在事件驱动或数据绑定的系统中...
观察者模式是一种行为型设计模式,它广泛应用于Java事件处理机制中。本文将深入分析观察者模式的组成部分和应用场景,并探讨Java事件处理机制的原理,以及事件源、事件、监听器与观察者设计模式中各角色的对应关系。...
#### 二、Java中常用设计模式的应用实例 **2. 说出在标准JDK中使用的一些设计模式。** - **装饰器模式**:在Java I/O库中,如`BufferedReader`和`BufferedWriter`。 - **单例模式**:`java.util.Calendar`类中的...
Observer模式,也称为订阅或发布-订阅模式,是软件设计模式中的行为模式之一。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件...
在Java编程中,设计模式是解决特定问题的模板,它们是经过验证的、高效且可重用的解决方案。设计模式的使用有助于提升代码的可读性、可维护性和可扩展性。以下是根据提供的标题和描述中提及的一些设计模式及其应用...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的系统...
设计模式和框架笔试题 在软件开发中,设计模式和框架扮演着非常重要的角色。设计模式是一种通用的解决问题的方法,它可以被应用于不同的场景中,而框架则是一种半成品,可以帮助开发者快速地开发出软件系统。在这里...
观察者模式(Observer Pattern)是设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在`javalib-observer`库中,它提供了Java版的事件...
Java的发布订阅(Publish-Subscribe)模型是一种设计模式,它基于“观察者”模式,用于在对象之间建立一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在...