Java Listener: A Java Bedtime Story

This article is modeled . NET Delegates: AC # Bedtime Story realization of the function of
the Java code, schedule, there is no written text stories. See the original link.

Interfaces:


package com.steven.demo;  

import java.util.EventListener;
import java.util.EventObject;  

public interface StevenEventListener extends EventListener {
    public void doListen(EventObject e);
}

package com.steven.demo;
public interface IAppraisable {
    public void appraise(String name, int degree);
}

Events:
Work Events.


package com.steven.demo;
import java.util.EventObject;
public class WorkEvent extends EventObject {  

    private String eventMsg = "Do Work";  

    public String getEventMsg() {
        return eventMsg;
    }
    public void setEventMsg(String eventMsg) {
        this.eventMsg = eventMsg;
    }  

    private static final long serialVersionUID = 6232430258434094316L;
    /**
     * @param source Event source
     */
    public WorkEvent(Object source) {
        super(source);
    }
}

Life events (2 class).


package com.steven.demo;
import java.util.EventObject;
public abstract class LifeEvent extends EventObject {
    public abstract String getEventMsg();  

    public LifeEvent(Object source) {
        super(source);
    }
    private static final long serialVersionUID = -5117554641874171524L;
}

package com.steven.demo;
public class BornEvent extends LifeEvent {
    private String eventMsg = "Birth";  

    public String getEventMsg() {
        return eventMsg;
    }
    public void setEventMsg(String eventMsg) {
        this.eventMsg = eventMsg;
    }
    public BornEvent(Object source) {
        super(source);
    }
    private static final long serialVersionUID = 8880371520168303175L;
}

package com.steven.demo;
public class DieEvent extends LifeEvent {
    public DieEvent(Object source) {
        super(source);
    }
    private String eventMsg = "Death";
    public String getEventMsg() {
        return eventMsg;
    }
    public void setEventMsg(String eventMsg) {
        this.eventMsg = eventMsg;
    }
    private static final long serialVersionUID = 5643693360168396103L;
}

Listener:


package com.steven.demo;
import java.util.EventObject;
public class Boss implements StevenEventListener{  

    /**
     * WorkEvent Listen
     */
    @Override
    public void doListen(EventObject e) {
        if(e instanceof WorkEvent){
            System.out.println("Boss"+e.getSource()+"work started!");  

            try {
                Thread.currentThread().sleep(500);
            } catch (InterruptedException e1) {
            }  

            Object source = e.getSource();
            if(source instanceof IAppraisable){
                IAppraisable ia = (IAppraisable)source;
                //Rating  
                ia.appraise("Boss", 5);
            }
        }
    }  

}

package com.steven.demo;  

import java.util.EventObject;  

public class God implements StevenEventListener {  

    @Override
    public void doListen(EventObject e) {
        if (e instanceof LifeEvent) {
            LifeEvent de = (LifeEvent) e;
            System.out.println("God:(Life Time)" + de.getSource() + de.getEventMsg());
        }  

        if (e instanceof WorkEvent) {
            WorkEvent de = (WorkEvent) e;  

            System.out.println("God:(Work Time)" + de.getSource() + de.getEventMsg());  

            try {
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e1) {
            }  

            Object source = e.getSource();
            if(source instanceof IAppraisable){
                IAppraisable ia = (IAppraisable)source;
                ia.appraise("God", 6);
            }
        }
    }
}

package com.steven.demo;  

import java.util.EventObject;  

public class Satan implements StevenEventListener {  

    @Override
    public void doListen(EventObject e) {
        if (e instanceof DieEvent) {
            DieEvent de = (DieEvent) e;
            System.out.println("Satan:" + de.getSource() + de.getEventMsg());
        }
    }  

}

Event Source:


package com.steven.demo;
import java.util.EventObject;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;  

public class Worker implements IAppraisable {
    private String name;
    private Map<Class<? extends EventObject>, List<StevenEventListener>> listenerMap;
    public Worker(String name) {
        this.name = name;
        listenerMap = new HashMap<Class<? extends EventObject>, List<StevenEventListener>>();
    }
    @Override
    public String toString() {
        return name;
    }
    // add Listener
    public synchronized void addListener(StevenEventListener listener,
            Class<? extends EventObject>... eventClass) {
        if (null != listenerMap) {
            if (eventClass.length <= 0) {
                throw new RuntimeException("Please specify an event to listen!");
            } else {
                for (int i = 0; i < eventClass.length; i++) {
                    Class<? extends EventObject> e = eventClass[i];
                    List<StevenEventListener> list = null;
                    if (listenerMap.containsKey(e)) {
                        list = listenerMap.get(e);
                    }
                    if (null == list) {
                        list = new LinkedList<StevenEventListener>();
                    }
                    if (list.contains(listener)) {  

                        continue;
                    }
                    list.add(listener);
                    listenerMap.put(e, list);
                }
            }
        }
    }
    // Remove Event Listener  
    public synchronized void removeEventListener(StevenEventListener listener,
            Class<? extends EventObject>... eventClass) {
        if (null != listenerMap) {
            if (eventClass.length <= 0) {
                for (Map.Entry<Class<? extends EventObject>, List<StevenEventListener>> entry : listenerMap
                        .entrySet()) {
                    List<StevenEventListener> list = entry.getValue();
                    if (null != list) {
                        list.remove(listener);
                    }
                }
            } else {
                for (int i = 0; i < eventClass.length; i++) {
                    Class<? extends EventObject> e = eventClass[i];
                    if (listenerMap.containsKey(e)) {
                        List<StevenEventListener> list = listenerMap.get(e);
                        if (null != list) {
                            list.remove(listener);
                        }
                    }
                }
            }
        }
    }
    public synchronized void removeListener(StevenEventListener listener) {
        if (null != listenerMap) {
        }
    }  

    public synchronized void removeAllListener() {
        if (null != listenerMap) {
            listenerMap.clear();
        }
    }  

    public void doEvent(final EventObject e) {
        if (null != listenerMap) {
            for (Map.Entry<Class<? extends EventObject>, List<StevenEventListener>> entry : listenerMap
                    .entrySet()) {
                if (entry.getKey().isInstance(e)) {
                    if (null != entry.getValue()) {
                        for (final StevenEventListener stevenEventListener : entry
                                .getValue()) {
                            if (null != stevenEventListener) {
                                // stevenEventListener.doListen(e);  

                                Thread t = new Thread(new Runnable() {
                                    public void run() {
                                        stevenEventListener.doListen(e);
                                    }
                                });  

                                // t.setDaemon(true);  

                                t.start();  

                                // try {  
                                // t.join();
                                // } catch (InterruptedException e1) {  
                                // }  
                            }
                        }
                    }
                }
            }
        }
    }  

    public void work() {
        System.out.println("@ I have been working!");
        doEvent(new WorkEvent(this));
    }
    public void born() {
        System.out.println("@ I was born in!");
        doEvent(new BornEvent(this));
    }
    public void die() {
        System.out.println("@ I am dead!");
        doEvent(new DieEvent(this));
    }  

    @Override
    public void appraise(String name, int degree){
        System.out.println(name+"evaluation Level"+degree);
    }  

}

Running:


package com.steven.demo;
public class Run {
    public static void main(String[] args) {
        System.out.println("\t Beginning of the process");  

        Worker worker = new Worker("My name");
        Boss boss = new Boss();
        God god = new God();
        Satan satan = new Satan();
        //The boss is only concerned with the work 
        worker.addListener(boss, WorkEvent.class);
        worker.addListener(god, WorkEvent.class, LifeEvent.class);
        worker.addListener(satan, DieEvent.class);
        worker.work();
        worker.born();
        worker.die();
        System.out.println("\t End of the process");
    }
}
Digg Google Bookmarks reddit Mixx StumbleUpon Technorati Yahoo! Buzz DesignFloat Delicious BlinkList Furl

One Comment on "Java Listener: A Java Bedtime Story"

commenter

Thread.currentThread().sleep(500);

should be written as

Thread.sleep(500);

since sleep is a static method

Leave a Reply

Name:
Email:
Website:
Comment:
XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>