A cSharp-like event model for java, decoupe code gracefully.
Java中完美實現C#的Event-EventHandler-EventArgs事件模式,代碼優雅解耦合。java
Import cn.hz.Events.jar
in your project first, or import source code.
首先項目中引入cn.hz.Events.jar
包,或源碼。git
Class which supply events and fire events.
包含事件並觸發事件的類。github
public class Subject { //Simple event Event event1 = new Event(); //Event with arguments Event2<String, Integer> eventWithArg = new Event2<>(); //Sample of removeListener Event3<Subject, Integer, Integer> eventRemoved = new Event3<>(); public void start() { // fire events at the appropriate time onEvent1(new EventArgs()); onEvent2(new EventArgs2<>("Event2", 2)); onEvent3(new EventArgs3<>(this, 3, 3)); } protected void onEvent1(EventArgs e) { if (!event1.isEmpty()) { event1.fire(this, e); } } protected void onEvent2(EventArgs2<String, Integer> e) { if (!eventWithArg.isEmpty()) { eventWithArg.fire(this, e); } } protected void onEvent3(EventArgs3<Subject, Integer, Integer> e) { if (!eventRemoved.isEmpty()) { eventRemoved.fire(this, e); } } }
Class which subscribe events.
事件訂閱者(或觀察者).app
public class Observer { public void bindEvents(Subject subject, EventChain chain) { // bind event listeners subject.event1.addListener((o, e) -> { System.out.println("event1 fired."); }); subject.eventWithArg.addListener((o, e) -> { System.out.println("eventWithArg fired, args: " + e.getData1() + "," + e.getData2()); }); chain.chainEvent.addListener((o, e) -> { System.out.println("chainEvent fired, args: " + e.getData1() + "," + e.getData2()); }); EventHandler3<Subject, Integer, Integer> handler3 = this::onEvent3; subject.eventRemoved.addListener(handler3); //remove event binding. message of event3 will not be shown subject.eventRemoved.removeListener(handler3); //Target must be exactly the same as addListener() ! } private void onEvent3(Object o, EventArgs3<Subject, Integer, Integer> e) { System.out.println("event3 fired, args: " + e.getData1() + "," + e.getData2() + "," + e.getData3()); } }
詳見源碼(Source code):https://github.com/hzsrc/hzEv...this