Java Event Delegation Model : Example using Core Java.
Event Delegation model is just a mechanism of broadcasting an event.
There are basically 3 entities involved in event delegation model.
- Event - It is an element which describes the event.
- Event source - It is an element which generates the event and sends it to the listener.
- Event listener - It is an element which receives the event sent by the source and executes a specific functionality with respective to the event.
Event.java
EventSource.java
EventListener.java
Events.java
package com.capitalcode.events;
/**
* The Class Event.
*/
public class Event {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The event name. */
private String eventName;
/** The event source. */
private EventSource eventSource;
/** The data. */
private Object data;
/**
* Instantiates a new event.
*
* @param eventName the event name
* @param eventSource the event source
* @param data the data
*/
public Event(String eventName, EventSource eventSource, Object data) {
this.eventName = eventName;
this.eventSource = eventSource;
this.data = data;
}
/**
* Gets the event name.
*
* @return the event name
*/
public String getEventName() {
return eventName;
}
/**
* Gets the event source.
*
* @return the event source
*/
public EventSource getEventSource() {
return eventSource;
}
/**
* Gets the data.
*
* @return the data
*/
public Object getData() {
return data;
}
}
EventSource.java
package com.capitalcode.events;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* The Class EventSource : This class is responsible for sending the events to its registered Listeners.
*/
public class EventSource {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The map listener list which will store the registered listeners to this source for a specific event denoted by event name. */
protected Map<String, List<EventListener>> mapListenerList = new HashMap<String, List<EventListener>>();
/**
* Adds the event listener.
*
* @param eventName the event name
* @param listener the listener
*/
public void addEventListener(String eventName, EventListener listener) {
if(mapListenerList.get(eventName) == null){
List<EventListener> listenerList = new ArrayList<EventListener>();
mapListenerList.put(eventName, listenerList);
}
List<EventListener> listenerList = mapListenerList.get(eventName);
if(!listenerList.contains(listener)){
listenerList.add(listener);
}
}
/**
* Removes the event listener.
*
* @param eventName the event name
* @param listener the listener
*/
public void removeEventListener(String eventName, EventListener listener) {
if(mapListenerList.get(eventName) != null && mapListenerList.get(eventName).size() > 0){
mapListenerList.get(eventName).remove(listener);
}
}
/**
* Checks if is listener available.
*
* @param eventName the event name
* @return true, if is listener available
*/
public boolean isListenerAvailable(String eventName){
return !(mapListenerList.get(eventName) == null || mapListenerList.get(eventName).size() == 0);
}
/**
* Fire event.
*
* @param event the event
*/
final void fireEvent(Event event) {
List<EventListener> listenerList = mapListenerList.get(event.getEventName());
if(isListenerAvailable(event.getEventName())){
for (EventListener eventListener : listenerList) {
eventListener.onEvent(event);
}
}
}
}
EventListener.java
package com.capitalcode.events;
import java.io.Serializable;
/**
* The listener interface for receiving event events.
* The class that is interested in processing a event implements this interface,
* and the object created with that class is registered with a component using the
* component's <code>addEventListener<code> method. When
* the event event occurs, that object's appropriate
* method is invoked.
*
* @param <T> the generic type
* @see EventEvent
*/
public interface EventListener<T extends Event> extends Serializable {
/**
* On event.
*
* @param event the event
*/
public void onEvent(T event);
}
Events.java
package com.capitalcode.events;
/**
* The Class Events.
*/
public class Events {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/**
* Send event.
*
* @param e the event object
*/
public static void sendEvent(Event e){
e.getEventSource().fireEvent(e);
}
}
Below code will simulate the above scenario
package com.capitalcode.events;
/**
* The Class EventTest.
*/
public class EventTest {
/**
* The main method.
*
* @param args the arguments
*/
public static void main(String[] args){
//Simulated Code for getting the Order from database
final Order order = getOrderFromDB();
//We have registered on event named ON_DISPATCHED on the order.
//When Order status will be changed to DISPATCHED, this code will get executed
order.addEventListener("ON_DISPATCHED", new OrderEventListener());
//Change status the DISPATCHED
//At this time OrderEventListener.onEvent() method will get executed
order.setOrderStatus(Order.OrderStatus.DISPATCHED);
}
/**
* Gets the order from database.
*
* @return the order from retrieved from database
*/
public static Order getOrderFromDB(){
Order order = new Order();
order.setCustomerId(101);
order.setOrderId(123);
order.setOrderItems(new String[]{"Pen Drive","CD"});
order.setOrderStatus(Order.OrderStatus.ORDERED);
return order;
}
}
/**
* The Class OrderEventListener : Event Listener.
*/
class OrderEventListener implements EventListener<Event>{
private static final long serialVersionUID = 1L;
//Method Executed when the order status is changed to DISPATCHED
public void onEvent(Event event) {
if(((Order)event.getEventSource()).getOrderStatus().equals(Order.OrderStatus.DISPATCHED)){
//If order status is DISPATCHED executed the code for sending the mail to customer
System.out.println("Send a Mail to Customer");
}
}
}
/**
* The Class Order : Event Source.
*/
class Order extends EventSource{
private long orderId;
private long customerId;
private String[] orderItems;
private OrderStatus orderStatus;
public long getOrderId() {
return orderId;
}
public void setOrderId(long orderId) {
this.orderId = orderId;
}
public long getCustomerId() {
return customerId;
}
public void setCustomerId(long customerId) {
this.customerId = customerId;
}
public String[] getOrderItems() {
return orderItems;
}
public void setOrderItems(String[] orderItems) {
this.orderItems = orderItems;
}
public OrderStatus getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(OrderStatus orderStatus) {
this.orderStatus = orderStatus;
if(orderStatus.equals(OrderStatus.DISPATCHED)){
//When Order Status is DISPATCHED send the event to respective listeners
Events.sendEvent(new Event("ON_DISPATCHED", this, null));
}
}
enum OrderStatus{
ORDERED,DISPATCHED,RECEIVED;
}
}






0 comments:
Post a Comment