首页 技术 正文
技术 2022年11月18日
0 收藏 666 点赞 4,172 浏览 3559 个字

上文讲过观察者模式,尽管已经用了依赖倒转原则,但是"抽象通知者"还是依赖"抽象观察者",也就是说万一没有了抽象观察者这样的接口,通知的功能就完不成了。另一方面,每个具体观察者不一定是要调用"更新"方法。此时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<params.length;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<Event> 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();
}
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,581
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918