Java中事件委托机制的简单Demo

public class Test04_DelegatedEvent {
	//Java中的事件委托机制
	//监听器就是使用了事件委托机制的设计模式实现的,例如swing中的监听器
	//事件委托机制比观察者模式耦合度更低
	//观察者模式代码:略(需要一个被观察者接口)
	//事件委托机制(不需要被观察者接口)
	@Test
	public void test() {
		//定义两个委托者
		class Dog{
			@SuppressWarnings("unused")
			void speak() {
				System.out.println("狗叫");
			}
		}
		class Cat{
			@SuppressWarnings("unused")
			void show(Integer x) {
				for(int i=0;i<x;i++) {
					System.out.println("猫叫第"+(i+1)+"声");
				}
			}
		}
		//声明一个执行者
		EventHandler xiaoming = new EventHandler();
		//声明两个委托者
		Dog dog = new Dog();
		Cat cat = new Cat();
		//狗和猫委托小明执行相关方法
		xiaoming.addEvent(dog, "speak");
		xiaoming.addEvent(cat, "show", 3);
		//小明执行方法
		xiaoming.notifyX();
		
	}
}
//第一步:首先需要一个事件类[描述等下被通知者需要执行的方法]
class Event{
	private Object obj;//执行者将调用该对象的方法
	private String methodName;//方法名字(反射用)
	private Object[] methodParameter;//方法参数
	private Class<?>[] methodType;//方法参数类型
	public Event(Object obj, String methodName, Object...methodParameters) {
		super();
		this.obj = obj;
		this.methodName = methodName;
		this.methodParameter = methodParameters;
		int len = methodParameters.length;
		this.methodType = new Class[len];
		for(int i=0;i<len;i++) {
			methodType[i] = methodParameters[i].getClass();
		}
	}
	//执行该对象的方法
	public void invoke() {
		try {
			Method method = obj.getClass().getDeclaredMethod(methodName, methodType);
			method.invoke(obj, methodParameter);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
//第二步:定义一个事件的处理者(执行者,别的类委托它来处理)
class EventHandler{
	private List<Event> list = new ArrayList<Event>();
	//添加需要委托的事情
	public void addEvent(Object obj, String methodName, Object...methodParameters) {
		list.add(new Event(obj, methodName, methodParameters));
	}
	//循环执行这些事情
	public void notifyX() {
		for (Event event : list) {
			event.invoke();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/howroad/article/details/80202035