现在已经加入了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
分享到:
相关推荐
现在我们来看看如何在AS3中实现一个基于观察者模式的事件处理机制: 1. **创建自定义事件类**:首先,我们需要定义一个自定义的事件类,继承自`flash.events.Event`。例如,我们可以创建一个名为`CustomEvent`的类...
观察者模式的这种实现方式使得OECP社区能够灵活地扩展功能,因为新的事件类型和监听器可以轻松地加入到系统中,而不会对现有代码造成过多的影响。同时,这种模式也支持了系统的模块化,每个模块只需要关注自己的职责...
本文将深入分析观察者模式的组成部分和应用场景,并探讨Java事件处理机制的原理,以及事件源、事件、监听器与观察者设计模式中各角色的对应关系。 观察者模式的组成部分包括被观察者(Subject)和观察者(Observer...
这样,当按钮被点击(事件发生)时,不仅会执行监听器中的动作,还可以更新其他依赖于这个事件的状态,符合观察者模式的定义。 在实际项目中,监听机制和观察者设计模式常用于构建响应式的用户界面、实现业务逻辑的...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,这种模式被广泛应用于事件处理,例如JavaBeans事件。 JavaBeans...
例如,当用户在网页上点击按钮时,按钮作为被观察者,会触发一系列事件,这些事件的监听器(观察者)会接收到通知并执行相应的操作,如弹出对话框、刷新页面等。 6. **优缺点**:优点是实现了对象间的抽象耦合,...
在Java中,我们可以利用Java提供的内置监听器机制来实现观察者模式,例如`ApplicationListener`和`ApplicationEvent`,这两个类主要用于Swing或JavaFX应用程序中的事件处理。 首先,我们来看`ApplicationListener`...
与每个元素都绑定事件监听器不同,事件委托将监听器放在共享的父元素上,然后通过事件冒泡机制来捕获子元素的事件。这降低了内存消耗,提高了性能,因为只需要维护一个事件处理器,而不是为每个子元素创建一个。 **...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...
监听器模式是Java设计模式中的一种行为型模式,主要用于监听某些事件的发生,并在事件发生时自动执行预定义的操作。在实际开发中,监听器模式可以用于多种场景,如UI事件处理、事件广播、异步通知等。 在监听器模式...
可能包括一个简单的事件发布系统,其中有一个事件源(主题)和多个事件监听器(观察者),通过触发事件和响应事件来演示模式的用法。 在实际开发中,Java的`java.util.Observable`和`java.util.Observer`类库提供了...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在C++中,这种模式经常用于游戏开发,特别是在像cocos2d-x这样的2D游戏引擎...
除了标准实现,还有很多其他语言和框架提供了观察者模式的支持,例如在C#中,可以使用System.ComponentModel.INotifyPropertyChanged接口来实现,而在JavaScript中,可以通过事件监听器或者发布/订阅模式来实现类似...
使用`addObserver:selector:name:object:`方法将观察者(通常是控制器或任何需要监听事件的类)添加到通知中心。参数包括: - `observer`: 要添加的观察者对象。 - `selector`: 当接收到通知时要调用的方法。 - ...
观察者模式有多种变体,如发布/订阅模式、模型-视图-控制器(MVC)架构中的模型与视图之间的关系,以及Java的事件监听机制等。 综上所述,观察者模式是软件设计中的重要工具,它通过引入一种间接的依赖关系,使得...
观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...
在Android开发中,回调模式和观察者模式是两种常见的事件处理机制,它们在软件设计模式中扮演着重要的角色,主要用于实现组件之间的通信。本文将详细探讨这两种模式,并结合Android环境进行解析。 首先,我们来理解...
观察者模式(Observer)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用于事件处理和实时...
AS3中的事件处理是基于观察者模式,它允许对象之间进行通信而不必直接耦合。在PHP中实现类似机制可以帮助我们创建更灵活、可扩展的代码结构。 首先,我们看到`Exception_Event`类,这是自定义的异常类,继承自PHP...
例如,在Web开发中,可以使用观察者模式处理用户交互事件,当用户触发某个操作时,相关的监听器(观察者)会得到通知并执行相应的逻辑。 总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助...