`
junlas
  • 浏览: 63597 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

看了AS3中的事件机制,模仿写了个监听器(观察者)模式

阅读更多

现在已经加入了flash的行列中了,但是还是不舍得抛掉JAVA,偶尔还是会写写java代码;

感觉要比设计模式中的简单的观察者模式有所改进,也有诸多不足,还望多指点指教。

谢谢~~~~~

 

不想说太多的解释(正在上班中... .),先画个UML类图看看吧,很丑陋(没有工具,就直接用windows自带的画图工具了):

 

 

 

画个图累死了~~~

 

下面直接看代码吧:(还是以网上的"模拟公交车上的打卡机打卡"为例)

 

 

 

//----------------------模拟公交车上的打卡机打卡-------------CardMachine.java

import java.util.Date;

/**
 * 发送者
 * 
 * @author junlas
 * 
 */
public class CardMachine extends EventDispatcher
{
	public void dispatcher()
	{
		dispatcher(new EventPunchCard(EventPunchCard.type1,new Date()));
		dispatcher(new EventPunchCard(EventPunchCard.type2,new Date()));
	}
	
	public String toString()
	{
		return "我是打卡机器\n";
	}
	

	/**
	 * 测试打卡机器运转
	 * 
	 * @param args
	 */
	public static void main(String[] args)
	{
		CardMachine machine = new CardMachine();
		Listener screen = new Screen();
		Listener speaker = new Speaker();
		machine.addEventListener(EventPunchCard.type1, screen);
		machine.addEventListener(EventPunchCard.type1, speaker);
		machine.addEventListener(EventPunchCard.type2, speaker);
		machine.dispatcher();
		System.out.println("---------------------------------------------");
		machine.removeEventListener(EventPunchCard.type1, speaker);
		machine.dispatcher();
	}
}

 

/**
 * 油包
 * @author junlas
 *
 */
public class Event
{
	private String type;
	private EventDispatcher target;
	
	public Event(String type)
	{
		this.type = type;
	}
	
	public String getType()
	{
		return type;
	}

	public EventDispatcher getTarget()
	{
		return target;
	}

	public void setTarget(EventDispatcher target)
	{
		this.target = target;
	}
	
	
}

 

import java.util.LinkedList;
 import java.util.List;import java.util.Iterator;

/**
 * 第三方
 * @author junlas
 *
 */
public class EventDispatcher
{
	private List<Record<String, Listener>> foldSet = new LinkedList<Record<String,Listener>>();
	
	/**
	 * 发送
	 * @param evt
	 */
	public void dispatcher(Event evt)
	{
		evt.setTarget(this);
		Iterator<Record<String, Listener>> it = foldSet.iterator();
		while(it.hasNext())
		{
			Record<String, Listener> one = it.next();
			if(one.getKey().equals(evt.getType()))
			{
				one.getValue().performPunch((EventPunchCard)evt);
			}
		}
	}
	
	/**
	 * 注册监听
	 * @param type
	 * @param listener
	 */
	public void addEventListener(String type,Listener listener)
	{
		Record<String,Listener> one = new Record<String, Listener>(type,listener);
		foldSet.add(one);
	}
	
	/**
	 * 移除监听
	 * @param type
	 * @param listener
	 */
	public void removeEventListener(String type,Listener listener)
	{
		Iterator<Record<String, Listener>> it = foldSet.iterator();
		while(it.hasNext())
		{
			Record<String, Listener> one = it.next();
			if(one.getKey().equals(type) && one.getValue().equals(listener))
			{
				it.remove();
				break;
			}
			
		}
	}
	

}

 

//---------------------------定义打卡这个事件-----------------------EventPunchCard.java

import java.util.Date;

/**
 * 打卡事件<BR>
 * 在什么时间,由XX触发打卡这个操作(事件)
 * 
 * @author junlas
 * 
 */
public class EventPunchCard extends Event
{
	public static final String type1 = "screen";
	public static final String type2 = "speaker";
	
	private Date time; // 记录事件发生的时间

	public EventPunchCard(String type,Date time)
	{
		super(type);
		this.time = time;
	}

	public Date getTime()
	{
		return time;
	}

}

 

//----------------------------展现状态的接口-----------------------EventPunchCardListener.java

/**
 * 侦听者<br/>
 * 监听接口:监听打开的一系列状态的接口
 * 
 * @author junlas
 * 
 */
public interface Listener
{
	public void performPunch(EventPunchCard punch);
}

 

//----------------------------------展现的一个状态实现:显示--------------------------Screen.java

/**
 * 打卡机的显示屏<BR>
 * 用于显示打卡后的状态
 * 
 * @author junlas
 * 
 */
public class Screen implements Listener
{
	/**
	 * 显示余额
	 */
	@Override
	public void performPunch(EventPunchCard punch)
	{
		System.out.print("[Screen]:" + punch.getTime() + " ," + punch.getTarget());
		System.out.println("您的余额为XX !");
	}
}

 

//------------------------------展现的一个状态实现:声音------------------------------Speaker.java

/**
 * 打卡机的扬声器<BR>
 * 用于提醒打卡后的状态
 * 
 * @author junlas
 * 
 */
public class Speaker implements Listener
{
	/**
	 * 声音提醒
	 */
	public void performPunch(EventPunchCard punch)
	{
		System.out.print("[Speaker:]" + punch.getTime() + " ," + punch.getTarget());
		java.awt.Toolkit.getDefaultToolkit().beep();
	}
}

 

/**
 * 自定义的类型,至少可以看到数据类型,否则都是Object
 * @author junlas
 *
 * @param <K>
 * @param <V>
 */
public class Record<K,V>
{
	private Object[] record;
	
	public Record(K key,V value)
	{
		record = new Object[2];
		record[0] = key;
		record[1] = value;
	}
	
	public K getKey()
	{
		return (K)record[0];
	}
	
	public V getValue()
	{
		return (V)record[1];
	}
}

  个人感觉,这样子就使得发送方和接收方完全解耦了....

 欢迎大虾们多指点,多拍砖。。。

  • 大小: 68.2 KB
1
1
分享到:
评论
2 楼 junlas 2010-03-28  
Mybeautiful 写道
很好!UML图中EventDispatcher跟Listener箭头是不是画反了?


哈~~~~~ 确实是的,多谢提醒,一会改改..
1 楼 Mybeautiful 2010-03-28  
很好!UML图中EventDispatcher跟Listener箭头是不是画反了?

相关推荐

    事件机制 观察者模式

    现在我们来看看如何在AS3中实现一个基于观察者模式的事件处理机制: 1. **创建自定义事件类**:首先,我们需要定义一个自定义的事件类,继承自`flash.events.Event`。例如,我们可以创建一个名为`CustomEvent`的类...

    社区事件驱动机制-观察者模式实用

    观察者模式的这种实现方式使得OECP社区能够灵活地扩展功能,因为新的事件类型和监听器可以轻松地加入到系统中,而不会对现有代码造成过多的影响。同时,这种模式也支持了系统的模块化,每个模块只需要关注自己的职责...

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

    本文将深入分析观察者模式的组成部分和应用场景,并探讨Java事件处理机制的原理,以及事件源、事件、监听器与观察者设计模式中各角色的对应关系。 观察者模式的组成部分包括被观察者(Subject)和观察者(Observer...

    java中监听机制,以及观察者设计模式

    这样,当按钮被点击(事件发生)时,不仅会执行监听器中的动作,还可以更新其他依赖于这个事件的状态,符合观察者模式的定义。 在实际项目中,监听机制和观察者设计模式常用于构建响应式的用户界面、实现业务逻辑的...

    观察者模式与JavaBeans事件

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

    设计模式-观察者

    例如,当用户在网页上点击按钮时,按钮作为被观察者,会触发一系列事件,这些事件的监听器(观察者)会接收到通知并执行相应的操作,如弹出对话框、刷新页面等。 6. **优缺点**:优点是实现了对象间的抽象耦合,...

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

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

    观察者模式Vs事件委托Demo

    与每个元素都绑定事件监听器不同,事件委托将监听器放在共享的父元素上,然后通过事件冒泡机制来捕获子元素的事件。这降低了内存消耗,提高了性能,因为只需要维护一个事件处理器,而不是为每个子元素创建一个。 **...

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

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

    Java设计模式之监听器模式实例详解

    监听器模式是Java设计模式中的一种行为型模式,主要用于监听某些事件的发生,并在事件发生时自动执行预定义的操作。在实际开发中,监听器模式可以用于多种场景,如UI事件处理、事件广播、异步通知等。 在监听器模式...

    观察者模式最佳实践

    可能包括一个简单的事件发布系统,其中有一个事件源(主题)和多个事件监听器(观察者),通过触发事件和响应事件来演示模式的用法。 在实际开发中,Java的`java.util.Observable`和`java.util.Observer`类库提供了...

    c++观察者模式实例

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

    观察者模式学习

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

    IOS 观察者模式实例Demo

    使用`addObserver:selector:name:object:`方法将观察者(通常是控制器或任何需要监听事件的类)添加到通知中心。参数包括: - `observer`: 要添加的观察者对象。 - `selector`: 当接收到通知时要调用的方法。 - ...

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

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

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

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

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

    在Android开发中,回调模式和观察者模式是两种常见的事件处理机制,它们在软件设计模式中扮演着重要的角色,主要用于实现组件之间的通信。本文将详细探讨这两种模式,并结合Android环境进行解析。 首先,我们来理解...

    观察者模式Observer

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

    仿AS3实现PHP 事件机制实现代码

    AS3中的事件处理是基于观察者模式,它允许对象之间进行通信而不必直接耦合。在PHP中实现类似机制可以帮助我们创建更灵活、可扩展的代码结构。 首先,我们看到`Exception_Event`类,这是自定义的异常类,继承自PHP...

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

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

Global site tag (gtag.js) - Google Analytics