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

java Event机制 、 observer设计模式

    博客分类:
  • j2se
 
阅读更多

 

研究了一下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了后可能还是不明白。。 

分享到:
评论

相关推荐

    Observer设计模式实例

    Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。

    JAVA设计模式chm文档

    设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter...

    委托、事件与Observer设计模式

    以实例方式详细讲述了委托、事件与Observer设计模式,每一步都有注释说明,便于大家理解。 适合新手入门理解什么是委托、事件与Observer设计模式

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    详解C#委托,事件,Observer设计模式

    详解C#委托,事件,Observer设计模式 1.将方法作为方法的参数 2.将方法绑定到委托 3.事件的由来 4.事件和委托的编译代码 5.委托、事件与Observer设计模式 6..Net Framework中的委托与事件

    Observer设计模式

    观察者模式中推拉模式两种实现方式,主要是针对开发的一个项目的模型抽象出来的。有一个项目,有压力传感器、位移传感器、震动传感器等多种传感器每种类型有若干个传感器,对每个传感器做特定操作会引发历史曲线图、...

    java设计模式之Observer参考.pdf

    java设计模式之Observer参考.pdf

    详解Observer Pattern(观察者模式)在Java中的使用原理

    该示例是翻写一老外Observer Pattern的例子,本人觉得该示例是对该模式的非常精典的说明,于是花点功夫来翻写它,因为他的代码没有注释说明该模式的设计思想怎样体现在代码中去,所以,本人结合代码注释了关键代码的...

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    C#中的委托、事件和Observer设计模式使用方法示例

    此文档有助于学习C#委托、事件和Observer设计模式。

    设计模式C++学习之观察者模式(Observer)

    设计模式C++学习之观察者模式(Observer)

    java设计模式之Observer[整理].pdf

    java设计模式之Observer[整理].pdf

    33种JAVA设计模式DEMO

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计...

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

    结合微信公众号讲解观察者模式,生动形象,关键是上手快啊

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    JAVA 设计模式PPT

    首先介绍了Java中面向对象特性和技术,逐个分析Abstract Factory;Builder;Prototype;Singleton;Adapter (对象);Bridge;Composite;Decorator;Facade;Flyweight;Proxy;Iterator;Observer等模式

    23种设计模式的java源代码

    里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些代码对于初学者看起来稍微复杂一些,我...

    设计模式文档 chm

    设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter...

    OBserver模式设计实现

    Head First模式设计用的是Java,实现观察者模式使用C++

Global site tag (gtag.js) - Google Analytics