java委托_java委托

上文讲过观察者模式,尽管已经用了依赖倒转原则,但是"抽象通知者"还是依赖"抽象观察者",也就是说万一没有了抽象观察者这样的接口,通知的功能就完不成了。另一方面,每个具体观察者不一定是要调用"更新"方法。此时java利用反射即可实现,具体代码如下所示:

Event类

package com.jdk8.event.javaEvent;

import java.lang.reflect.Method;

public class Event {

//要执行方法的对象

private Object object;

//要执行的方法名称

private String methodName;

//要执行方法的参数

private Object[] params;

//要执行方法的参数类型

private Class[] paramTypes;

public Event(){

}

public Event(Object object,String methodName,Object...args){

this.object = object;

this.methodName = methodName;

this.params = args;

contractParamTypes(this.params);

}

//根据参数数组生成参数类型数组

private void contractParamTypes(Object[] params){

this.paramTypes = new Class[params.length];

for(int i=0;i

this.paramTypes[i] = params[i].getClass();

}

}

/* 执行该对象的方法 */

public void invoke() throws Exception {

Method method = null;

method = object.getClass().getMethod(this.getMethodName(),this.getParamTypes());

method.invoke(this.getObject(),this.getParams());

}

public Object getObject() {

return object;

}

public void setObject(Object object) {

this.object = object;

}

public String getMethodName() {

return methodName;

}

public void setMethodName(String methodName) {

this.methodName = methodName;

}

public Object[] getParams() {

return params;

}

public void setParams(Object[] params) {

this.params = params;

}

public Class[] getParamTypes() {

return paramTypes;

}

public void setParamTypes(Class[] paramTypes) {

this.paramTypes = paramTypes;

}

}

EventHandler类

package com.jdk8.event.javaEvent;

import java.util.ArrayList;

import java.util.List;

public class EventHandler {

private List objects;

public EventHandler(){

objects = new ArrayList<>();

}

//添加某个对象要执行的事件及需要的参数

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

objects.add(new Event(object,methodName,args));

}

//通知所有的对象执行制定的事件

public void notifyX() {

for(Event e : objects){

try {

e.invoke();

} catch (Exception e1) {

e1.printStackTrace();

}

}

}

}

Notifier抽象类

package com.jdk8.event.javaEvent;

public abstract class Notifier {

private EventHandler eventHandler = new EventHandler();

public EventHandler getEnventHandler(){

return eventHandler;

}

public void setEventHandler(EventHandler eventHandler){

this.eventHandler = eventHandler;

}

//增加需要放哨的学生

public abstract void addListener(Object object,String methodname,Object...args);

//告诉所有要帮忙放哨的学生:老师来了

public abstract void notifyX();

}

GoodNotifier类

package com.jdk8.event.javaEvent;

public class GoodNotifier extends Notifier {

@Override

public void addListener(Object object, String methodname, Object... args) {

System.out.println("有新的同学委托尽职尽责的放哨人!");

this.getEnventHandler().addEvent(object,methodname,args);

}

@Override

public void notifyX() {

System.out.println("尽职尽责的放哨人告诉所有需要帮忙的同学:老师来了!");

try{

this.getEnventHandler().notifyX();

}catch (Exception e){

e.printStackTrace();

}

}

}

PlayingGameListener类

package com.jdk8.event.javaEvent;

import java.util.Date;

public class PlayingGameListener {

public PlayingGameListener(){

System.out.println("我正在玩游戏,开始时间" + new Date());

}

public void stopPlayingGame(Date date,String name){

System.out.println("老师来了,快回到座位上,结束时间"+date + " " + name);

}

}

WatchingTVListener类

package com.jdk8.event.javaEvent;

import java.util.Date;

public class WatchingTVListener {

public WatchingTVListener(){

System.out.println("我正在看电视,开始时间" + new Date());

}

public void stopWatchingTV(Date date){

System.out.println("老师来了,快回到座位上,结束时间"+date);

}

}

TestMain类

package com.jdk8.event.javaEvent;

import java.util.Date;

public class TestMain {

public static void main(String[] args){

Notifier goodNotifier = new GoodNotifier();

PlayingGameListener playingGameListener = new PlayingGameListener();

WatchingTVListener watchingTVListener = new WatchingTVListener();

goodNotifier.addListener(playingGameListener,"stopPlayingGame",new Object[]{new Date(),new String()});

goodNotifier.addListener(watchingTVListener,"stopWatchingTV",new Date());

goodNotifier.notifyX();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值