目录
背景介绍
实现过程
类图
NS图
代码
客户端
业务封装类
委托类
事件类
猫类
老鼠类
运行结果
总结提升
背景介绍
相信大家在学习大话设计模式的时候都有接触过事件与委托,但是对于事件与委托具体的业务逻辑也不是很清楚,只能照猫画虎去使用事件与委托。当我们想去深入研究的时候发现,我们又不能看到delegate和event底层的代码。所以今天通过Java把delegate和event底层的代码写出来。明确底层原理之后在使用的时候才能得心应手。
实现过程
通过C#版本的事件与委托来绘制类图和NS图,对于事件和委托之间的关系可以大胆的猜测一下。只要最终的结果保持一致我们就可以先接收这样的类关系。
类图
NS图
图先行,在写代码之前一定要先画图。图能够指导我们的方向不会发生偏移。按照类图和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+"快跑!");
}
}
运行结果
总结提升
写代码是一个需要想象力和创造力的事情,而不是按照被人写的代码按部就班。按部就班的事情你可以做到别人也可以做到,甚至会被机器所代替。所以想象力和创造力就会非常的重要。有创造性的事情才不会被别人所代替。