0
点赞
收藏
分享

微信扫一扫

Java-设计模式中事件与委托Java版本


目录

背景介绍

实现过程

类图

 NS图

代码

客户端

业务封装类

委托类

事件类

猫类

老鼠类

运行结果

 总结提升

背景介绍

        相信大家在学习大话设计模式的时候都有接触过事件与委托,但是对于事件与委托具体的业务逻辑也不是很清楚,只能照猫画虎去使用事件与委托。当我们想去深入研究的时候发现,我们又不能看到delegate和event底层的代码。所以今天通过Java把delegate和event底层的代码写出来。明确底层原理之后在使用的时候才能得心应手。

实现过程

        通过C#版本的事件与委托来绘制类图和NS图,对于事件和委托之间的关系可以大胆的猜测一下。只要最终的结果保持一致我们就可以先接收这样的类关系。

类图

Java-设计模式中事件与委托Java版本_c#

 NS图

Java-设计模式中事件与委托Java版本_设计模式_02

         图先行,在写代码之前一定要先画图。图能够指导我们的方向不会发生偏移。按照类图和NS图的思路和形式实现代码百分八十不会出现问题。

代码

客户端

/**
 * @BelongsProject: DesignPattern
 * @BelongsPackage: CatAndMouse
 * @Author: Wuzilong
 * @Description: 客户端
 * @CreateTime: 2023-04-24 19:56
 * @Version: 1.0
 */

public class Client {
    public static void main(String[] args) throws Exception {

        Notice notice = new Notice();
        notice.notice();
    }
}

业务封装类

/**
 * @BelongsProject: DesignPattern
 * @BelongsPackage: CatAndMouse
 * @Author: Wuzilong
 * @Description: 业务封装类
 * @CreateTime: 2023-04-24 20:36
 * @Version: 1.0
 */

public class Notice {
    public void notice() throws Exception {

        Cat cat = new Cat("Tom");
        cat.addDelegate(new Delegate(new Mouse("Jerry"),"run"));
        cat.addDelegate(new Delegate(new Mouse("Jack"),"run"));
        cat.shout();
    }
}

委托类

/**
 * @BelongsProject: DesignPattern
 * @BelongsPackage: CatAndMouse
 * @Author: Wuzilong
 * @Description: 委托类
 * @CreateTime: 2023-04-24 19:56
 * @Version: 1.0
 */

public  class Delegate {
    private Object obj;
    private String methodName;
    private Object[] methodParameter;
    private Class<?>[] methodType;

    protected static List<Delegate> objects=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 eventHandler() throws Exception {
        Method method = obj.getClass().getDeclaredMethod(methodName, methodType);
        method.invoke(obj, methodParameter);
    }
}

事件类

/**
 * @BelongsProject: DesignPattern
 * @BelongsPackage: CatAndMouse
 * @Author: Wuzilong
 * @Description: 事件类
 * @CreateTime: 2023-04-24 19:56
 * @Version: 1.0
 */

public class  Event extends Delegate{

    public  void catShout() throws Exception {
        if (objects.size()!=0){
            for (Delegate object:objects){
                object.eventHandler();
            }
        }
    }
}

猫类

/**
 * @BelongsProject: DesignPattern
 * @BelongsPackage: CatAndMouse
 * @Author: Wuzilong
 * @Description: 猫类
 * @CreateTime: 2023-04-24 19:56
 * @Version: 1.0
 */

public class Cat {
    private String name;

    public Cat(String name){
        this.name=name;
    }
    private Event event = new Event();
    public void shout() throws Exception {
        System.out.println("喵,我是"+name);
        event.catShout();
    }
    public void addDelegate(Delegate source) {
        objects.add(source);
    }
}

老鼠类

/**
 * @BelongsProject: DesignPattern
 * @BelongsPackage: CatAndMouse
 * @Author: Wuzilong
 * @Description: 老鼠类
 * @CreateTime: 2023-04-24 19:56
 * @Version: 1.0
 */

public class Mouse {
    private String name;
    public Mouse(String name){
        this.name=name;
    }
    public void run(){
        System.out.println("老猫来了"+name+"快跑!");
    }
}

运行结果

Java-设计模式中事件与委托Java版本_类图_03

 总结提升

        写代码是一个需要想象力和创造力的事情,而不是按照被人写的代码按部就班。按部就班的事情你可以做到别人也可以做到,甚至会被机器所代替。所以想象力和创造力就会非常的重要。有创造性的事情才不会被别人所代替。

举报

相关推荐

0 条评论