java监听是如何实现的(手把手教学)

简介: java监听是如何实现的(手把手教学)

背景:

从最开始的开门小例子到后来的,使用C#事件与委托到java的事件与委托,老师针对发消息的人和收消息人的提出了监听器的概念,java的监听器是怎么实现的呢?是放置了两个空壳放置发消息的人和收消息的人。

过程

图:

讲完课以后

大概的图(这个还需要完善)

代码:

package 米老师讲的两个事件与委托2023年5月7日;
public class Client {
    public static void main(String[] args) throws Exception {
        Notice notice = new Notice();
        notice.notice();
    }
}
public class Notice {
    public void notice() throws Exception {
        Listener listener = new Listener();
        listener.addRegister(new CatEvent(),new Cat("Tom"), "shout");
        listener.addDelegate(new MouseEvent(),new Mouse("jerry"), "run");
        listener.addDelegate(new MouseEvent(),new Mouse("jack"), "run");
        listener.invoke();
    }
}
public class Register {
    protected Object obj;
    protected String methodName;
    protected Object[] methodParameter;
    protected Class<?>[] methodType;
    protected static List<Register> registerList=new ArrayList<>();
    public Register(){}
    public Register(Object obj, String methodName, Object... methodParameter) {
        this.obj = obj;
        this.methodName = methodName;
        this.methodParameter = methodParameter;
        int len = methodParameter.length;
        this.methodType = new Class[len];
        for (int i = 0; i < len; i++) {
            methodType[i] = methodParameter[i].getClass();
        }
    }
    public void invoke() throws Exception {
        Method method = obj.getClass().getDeclaredMethod(methodName, methodType);
        method.invoke(obj, methodParameter);
    }
    public  void addRegister(Register register){
    }
}```
```bash
public class CatEvent  extends  Register {
    public CatEvent() {
        super();
    }
    @Override
    public void invoke() throws Exception {
        for (Register d : registerList) {
            d.invoke();
        }
    }
    @Override
    public void addRegister(Register delegate) {
        System.out.println(delegate.toString());
        registerList.add(delegate);
    }
}
public class RegisterFather {
}
public class Cat extends   RegisterFather {
    private String name;
    public Cat(String name){
        this.name = name;
    }
    public void shout() {
        System.out.println("我是"+name+",我来了");
    }
}
public class Cat extends   RegisterFather {
    private String name;
    public Cat(String name){
        this.name = name;
    }
    public void shout() {
        System.out.println("我是"+name+",我来了");
    }
}
public class Delegate {
    protected Object obj;
    protected String methodName;
    protected Object[] methodParameter;
    protected Class<?>[] methodType;
    protected static List<Delegate> delegateList=new ArrayList<>();
    public Delegate(){}
    public Delegate(Object obj, String methodName, Object... methodParameter) {
        this.obj = obj;
        this.methodName = methodName;
        this.methodParameter = methodParameter;
        int len = methodParameter.length;
        this.methodType = new Class[len];
        for (int i = 0; i < len; i++) {
            methodType[i] = methodParameter[i].getClass();
        }
    }
    public void invoke() throws Exception {
        Method method = obj.getClass().getDeclaredMethod(methodName, methodType);
        method.invoke(obj, methodParameter);
    }
    public  void addDelegate(Delegate  delegate){
    }
}
public class MouseEvent extends  Delegate{
    public MouseEvent() {
        super();
    }
    @Override
    public void invoke() throws Exception {
        for (Delegate d : delegateList) {
            d.invoke();
        }
    }
    @Override
    public void addDelegate(Delegate delegate) {
        System.out.println(delegate.toString());
        delegateList.add(delegate);
    }
    public void delDelegate(Delegate delegate) {
        delegateList.remove(delegate);
    }
}
public class DelegateFather {
}
public class Mouse extends DelegateFather {
    private String name;
    public Mouse(String name){
        this.name = name;
    }
    public void run(){
        System.out.println("我是"+name+",我跑了");
    }
}

2023年5月9日22:37:21

更加完善了一下图,抽象出来发消息和收消息的接口

2023年5月11日10:16:36

完善了一版抽象出来体现多态的接口,使用配置文件读取确定运行时传入什么

基于上一次

public class Notice  {
    public void notice() throws Exception {
//        Listener listener = new Listener();
//        MouseEvent mouseEvent = new MouseEvent();
//
//        listener.addRegister(new CatEvent(),new Cat("Tom"), "shout");
//        listener.addDelegate(mouseEvent,new Mouse("jerry"), "run");
//        listener.addDelegate(mouseEvent,new Mouse("jack"), "run");
//        listener.invoke();
        Listener listener = new Listener();
        CatEvent catEvent = new CatEvent();
        MouseEvent mouseEvent = new MouseEvent();
        Properties properties = new Properties();
        properties.load(new FileInputStream("E:\\zy\\TGB-zgy-2022\\米老师设计模式课相关资料必须留着\\米老师设计模式课小例子\\JAVAtest\\entrust\\src\\main\\resources\\config.properties"));
        String catPath = (String) properties.get("catPath");
        String catMethod = (String) properties.get("catMethod");
        String[] catList = properties.get("catList").toString().split(",");
        String mousePath = (String) properties.get("mousePath");
        String mouseMethod = (String) properties.get("mouseMethod");
        String[] mouseList = properties.get("mouseList").toString().split(",");
        for (String catName : catList) {
            Object catInstance = Class.forName(catPath).getConstructor(String.class).newInstance(catName);
            listener.addRegister(catEvent, (ISend) catInstance, catMethod);
        }
        for (String mouseName : mouseList) {
            Object mouseInstance = Class.forName(mousePath).getConstructor(String.class).newInstance(mouseName);
            listener.addDelegate(mouseEvent, (IReceive) mouseInstance, mouseMethod);
        }
        listener.invoke();
    }
}

配置文件

catPath =end20230507.Cat
catMethod = send
catList = Tom,Tom4
mousePath =end20230507.Mouse
mouseMethod = receive
mouseList = Jerry,Ja

总结:

1加到n上是需要有n的前提的,知道java的监听器是怎么来的,将发消息和收消息的人进行匹配是在监听器中进行的,知道监听器是怎么来的,知其然,知其所以然。


相关文章
|
4月前
|
Java 测试技术 数据处理
Java零基础教学(17):Java运算符详解
【8月更文挑战第17天】Java零基础教学篇,手把手实践教学!
78 4
|
2月前
|
开发框架 IDE Java
java制作游戏,如何使用libgdx,入门级别教学
本文是一篇入门级教程,介绍了如何使用libgdx游戏开发框架创建一个简单的游戏项目,包括访问libgdx官网、设置项目、下载项目生成工具,并在IDE中运行生成的项目。
60 1
java制作游戏,如何使用libgdx,入门级别教学
|
2月前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
70 1
|
2月前
|
前端开发 Java API
Swagger接口文档 —— 手把手教学,全方位超详细小白能看懂,百分百能用Java版
本文提供了一份详细的Swagger接口文档生成工具的使用教程,包括了导入依赖、配置类设置、资源映射、拦截器配置、Swagger注解使用、生成接口文档、在线调试页面访问以及如何设置全局参数(如token),旨在帮助Java开发者快速上手Swagger。
641 0
Swagger接口文档 —— 手把手教学,全方位超详细小白能看懂,百分百能用Java版
|
2月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
191 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
2月前
|
Java C#
Java的监听处理事件--小球移动案例
Java的监听处理事件--小球移动案例
14 0
|
4月前
|
存储 缓存 Java
Java零基础教学(13):自动拆箱与自动装箱详解
【8月更文挑战第13天】Java零基础教学篇,手把手实践教学!
48 1
Java零基础教学(13):自动拆箱与自动装箱详解
|
4月前
|
存储 Java 测试技术
Java零基础教学(08):基本数据类型和取值范围
【8月更文挑战第8天】Java零基础教学篇,手把手实践教学!
42 5
Java零基础教学(08):基本数据类型和取值范围
|
3月前
|
存储 Java 测试技术
Java零基础教学(10):包装类
【9月更文挑战第1天】Java零基础教学篇,手把手实践教学!
50 1
|
4月前
|
算法 Java 测试技术
Java零基础教学(15):Java常量详解
【8月更文挑战第15天】Java零基础教学篇,手把手实践教学!
69 5
下一篇
DataWorks