Java – 信号事件模式

我受到了AS3中Signals事件模式的启发,它取代了flash的原生事件。 它在性能和可读性方面都做得更好。

所以我试图用Java实现它。

这种模式的主要思想是你正在使用对象而不是类型,因此节省了找到“Dispatcher”类来处理事件调度的时间。(调度事件是向所有侦听器发送事件)

所以让我们跳转到代码中:在这个示例中,我将创建AlarmManager并处理他的警报事件。

首先,我们需要为此事件创建接口

public interface IAlarmEvent { void alarmEventHandler(String alert); } 

现在事件本身:

 public class AlarmEvent extends Signal implements IAlarmEvent { public void alarmEventHandler(String alert) { dispatch("alarmEventHandler", alert); } } 

这是AlarmManger:

 public class AlarmManager { public final AlarmEvent alarmEvent = new AlarmEvent(); public void init(){ // Dispatching the event alarmEvent.alarmEventHandler("Wake up"); } } 

这是一个正在侦听此事件的活动:

 public class MainActivity extends Activity implements IAlarmEvent{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AlarmManager alarmManager = new AlarmManager(); alarmManager.alarmEvent.addListener(this); alarmManager.init(); } public void alarmEventHandler(String alert) { Log.d("MyLog", "Event : " + alert); } } 

以下是我编写Signal类的方法

 public abstract class Signal { private LinkedHashMap listeners = new LinkedHashMap(); protected void dispatch(String methodName, Object...arguments){ Set keySet = listeners.keySet(); if(keySet.size() == 0){ return; } Iterator iterator = keySet.iterator(); Method method = null; do{ T listener = iterator.next(); if(method == null){ try { Class[] classes = new Class[arguments.length]; for(int i = 0; i < arguments.length; i++){ classes[i] = arguments[i].getClass(); } method = listener.getClass().getMethod(methodName, classes); } catch (NoSuchMethodException e) { e.printStackTrace(); } } try { method.invoke(listener, arguments); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }while(iterator.hasNext()); } public void addListener(T listener) { listeners.put(listener, listener); } public void removeListener(T listener) { listeners.remove(listener); } } 

这种模式是:

  • 快 – 不需要搜索类型并触发eventDispatcher,它立即完成。
  • 具有良好的可读性 – 只需查看课程,您就可以确切了解他发送的事件以及每个事件的外观。

然而,它运作不佳。 如果我使用基元作为我的接口,Signal无法找到方法并调用它。 而且我不喜欢将Method名称传递给信号的想法。 任何想法如何改善这个? 你对这种模式有什么看法?

似乎这种模式已经在这些类中实现

  java.util.Observable java.util.Observer