我们用基类和事件监听器approch来设计我们的应用程序,因此基类和事件监听器接口。基类调用任何操作后调用适当的事件监听器方法。以下代码显示了我的设计:
import java.util.EventListener;
public interface MyEventListener extends EventListener
{
public void preOperation();
public void postOperation();
}
然后我按如下方式实现此接口:
class MyEventListenerImpl implements MyEventListener
{
@Override
public void postOperation()
{
System.out.println("Do previous operation");
}
@Override
public void preOperation()
{
System.out.println("Do post operation");
}
}
然后我写基类如下:
abstract class Base
{
private MyEventListener eventListener; /* this member injected */
public abstract void operation_1();
public void doOperation_1()
{
eventListener.preOperation(); /* call listener before invoking main operation_1 implementation */
operation_1(); /* call main operation_1 implementation */
eventListener.postOperation(); /* call listener after invoking main operation_1 implementation */
}
}
完成这些工作后,我编写了Base类的实现并实现了operation_1方法。 我通过 java.util.EventListener 标记接口执行此方法,但在设计之后我的问题看到另一个类:
我不知道永远不会使用这些课程。我想知道两件事:
答案 0 :(得分:1)
在不知道应该解决哪个问题的情况下,很难讨论特定设计。
无论如何,你的设计的主要问题是你只能有一个听众。使用EventListenerSupport
可以轻松支持多个,并且可以使添加/删除侦听器方法无法实现。
另一个问题是您的侦听器方法不会将任何事件作为参数。这使得单个侦听器无法侦听多个Base
实例,因为它无法使用该事件来检测事件的来源。
答案 1 :(得分:0)
EventListener本质上无法知道将发生的事情,因为它是从您示例中的operation_1
内部触发的。
您正在寻找的是AOP方法拦截器。特别是aopalliances MethodInterceptor接口对你有用:
public Operation1Interceptor implements MethodInterceptor {
Object invoke(MethodInvocation invocation) throws Throwable {
/* feel free to access the arguments, if you wish */
foo(invocation.getArguments())
Object retval = invocation.proceed();
/* Log it or do whatever you want */
bar(retval);
baz();
return retval;
}
}
最简单的使用方式是Google Guice,但有一些教程。