JAVA 实现 委托(事件)暂时只有无参的
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA 实现 委托(事件)暂时只有无参的,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3244字,纯文字阅读大概需要5分钟。
内容图文
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author 乔占江 qq:59663479
* @Data 2021/1/23 20:37
* @Description 委托实现,无参数版本,未考虑多线程安全
* @Version 1.0
*/
public class Event {
// 管理所有的 委托事件
private static Map<String, List<EventDefine>> events = new HashMap<>();
public static void init() {
// 暂时在这里 写发布逻辑,以后考虑写一个A接口
// 想发布委托,就实现这个接口;
// 建议一个 模块仅仅一个类实现,将所有注册写在其中,方便他人查看
// 这个init会 查看所有实现A接口的方法,然后调用 发布方法;
// 发布一个 demo 委托
Event.release("demo");
}
/**
* 发布一个委托
*
* @param eventName 委托的名字
*/
public static void release(String eventName) {
List<EventDefine> eventDefines = events.get(eventName);
if (eventDefines != null) {
throw new RuntimeException("已存在的委托");
}
System.out.println("发布了一个委托,eventName为" + eventName);
// 这里不创建 List,因为不一定有人 关注
events.put(eventName, null);
}
/**
* 注册(关注) 一个 委托
*
* @param object 关注这个委托的对象 (A对象要关注 XX事件,这里就传A)
* @param methodName 当事件被触发,通知A对象的哪个方法
* @return 返回false表示 没有这个 委托
*/
public static boolean register(Object object, String eventName, String methodName) {
if (!events.containsKey(eventName)) {
return false;
}
List<EventDefine> defines = events.get(eventName);
if (defines == null) {
defines = new ArrayList<>();
events.put(eventName, defines);
}
defines.add(new EventDefine(object, methodName));
return true;
}
/**
* 不再关注 eventName
*
* @param object 哪个对象不想关注了
* @param eventName
*/
public static void remove(Object object, String eventName) {
List<EventDefine> defines = events.get(eventName);
if (defines == null || object == null) {
return;
}
for (int i = 0; i < defines.size(); i++) {
if (object.equals(defines.get(i).object)) {
System.out.println(object + "不再关注 " + eventName);
defines.remove(i);
return;
}
}
}
// 触发事件
public static void invoke(String eventName) {
List<EventDefine> defines = events.get(eventName);
if (defines == null || defines.size() == 0) {
return;
}
try {
for (EventDefine define : defines) {
Method method = define.object.getClass().getMethod(define.methodName, null);
if (method != null) {
method.invoke(define.object);
}
}
} catch (Exception e) {
System.out.println("eventName为:" + eventName + "的调用发生了错误");
e.printStackTrace();
}
}
private static class EventDefine {
// 关注 委托的对象
private Object object;
// 关注 委托的方法名
private String methodName;
public EventDefine(Object object, String methodName) {
this.object = object;
this.methodName = methodName;
}
}
}
import com.card.event.Event;
public class EventDemo {
public static void main(String[] args) {
Event.init();
EventDemo eventDemo1 = new EventDemo();
System.out.println(eventDemo1 + " 关注了 demo 的事件");
Event.register(eventDemo1,"demo","demo");
EventDemo eventDemo2 = new EventDemo();
System.out.println(eventDemo2 + " 关注了 demo 的事件");
Event.register(eventDemo2,"demo","demo");
EventDemo eventDemo3 = new EventDemo();
System.out.println(eventDemo3 + " 关注了 demo 的事件");
Event.register(eventDemo3,"demo","demo");
// eventDemo2 不再关注
Event.remove(eventDemo2,"demo");
// 触发demo 事件
Event.invoke("demo");
}
public void demo(){
System.out.println(this + " 收到通知");
}
}
内容总结
以上是互联网集市为您收集整理的JAVA 实现 委托(事件)暂时只有无参的全部内容,希望文章能够帮你解决JAVA 实现 委托(事件)暂时只有无参的所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。