1. 程式人生 > >Java中事件委託機制的簡單Demo

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();
		}
	}
}