首页 > 编程知识 正文

java事件监听模式,java三大框架

时间:2023-05-05 16:53:00 阅读:170889 作者:1491

委托事件

委托就像用别的方法代替了原来的方法,交给现在这个代替后的方法使用,使用时和原来的方法没有变化。

c#在语法中有委托的概念,所以实现起来非常方便,但是java中没有,所以只能自己使用发射机制来实现。

要在java中实现委托,必须首先定义事件类,其中包括要调用的对象、要调用的方法名称、方法所需的参数和参数类型

package com.suski.delegate;

import java.lang.reflect.Method;

公共类事件{

私有对象;

私有字符串方法名称;

权限对象[ ] params;

private Class[] paramTypes;

公共事件(objectobject,String method,Object.args ) )。

{

this.object=object;

this.methodName=method;

this.params=args;

contractparamtypes(this.Params;

}

privatevoidcontractparamtypes (object [ ] params ) )

{

this.param types=new class [ params.length ];

for(intI=0; I

{

this.param types [ I ]=params [ I ].getclass (;

}

}

public void invoke () throws Exception

{

Method method=object.getClass ().get method (this.method name,this.paramTypes ); //判断此函数是否存在

if (空值==方法) )。

{

返回;

}

method.invoke(this.object,this.params ); //利用反射机制调用函数

}

}

定义完事件类后,可以使用委托。 传递调用方法的对象、方法名称和参数就好了。

弥补观察者模式的缺点

要实现在昨天的观察器模式中实现的效果(一个类将更改通知给几个类),还必须定义事件管理队列中的类

package com.suski.delegate;

import java.util.ArrayList;

import java.util.List;

公共类事件管理器{

私有列表对象;

public EventHandler (

{

objects=new ArrayList (;

}

公共void addevent (objectobject,String methodName,Object.args ) )。

{

objects.add(newevent(object,methodName,args ) );

}

public void notifyX () throws Exception

{

事件事件:对象) )。

{

event.invoke (;

}

}

}

这个类将所有事件放入List中,到时候一次取出

定义队列后,可以为通知定义抽象类

package com.suski.delegate;

公共类通告程序{

privateeventhandlereventhandler=new eventhandler (;

publiceventhandlergeteventhandler (

{

return eventHandler;

}

publicvoidseteventhandler (事件事件发生器) )。

{

this.eventHandler=eventHandler;

}

publicabstractvoidaddlistener (objectobject,String methodName,Object.args );

公共备用语音通知(;

}

定义具体的实现类

package com.suski.delegate;

publicclassconcretenotifierextendsnotifier {

@Override

public void addlistener (object,String methodName,Object. args ) {

this.getEventHandler ().addevent(object,methodName,args );

}

@Override

公共void notifyx (

try {

this.getEventHandler ().notifyX );

}catch(exceptione ) {

//TODO: handle exception

e .打印任务跟踪(;

}

}

}

此时,定义需要通知的对象类即可

package com.suski.delegate;

import java.util.Date;

公共类watchingtvlistener {

public WatchingTVListener (

{

system.out.println(watchingTV );

}

publicvoidstopwatchingtv (datedate ) )

{

system.out.println (stop watching ' date;

}

}

package com.suski.delegate;

import java.util.Date;

publicclassplayinggamelistener {

public PlayingGameListener (

{

system.out.println(playing );

}

公共桌面播放表(datedate ) )。

{

system.out.println (stop playing ' date;

}

}

测试方法

package com.suski.delegate;

import java.util.Date;

公共类测试{

publicstaticvoidmain (string [ ] args ) )。

{

notifiergoodnotifier=newconcretenotifier (;

playinggamelistenerplayinggamelistener=newplayinggamelistener (;

watchingtvlistenerwatchingtvlistener=newwatchingtvlistener (;

good notifier.addlistener (playinggamelistener,' stopPlayingGame ',new Date ) );

good notifier.addlistener (watchingtvlistener,' stopWatchingTV ',new Date ) );

goodNotifier.notifyX (;

}

}

这样就负责c#的委托了。 这样,观察者模式的缺点也得到改善。 通知者类完全不知道自己需要通知的是谁,完全可以解除耦合。 同时也移除了抽象的观察者类。

昨天完全不知道java的委托怎么办,但终于找到了一个。 这感觉很好,所以写下来和大家分享。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。