Java中事件委託機制的簡單Demo
阿新 • • 發佈:2019-02-01
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(); } } }