您的位置:首页 > 其它

自己动手实现-监听器

2016-03-21 01:21 344 查看
监听器就是在执行一些操作的时候通知监听此事件的对象执行一定的方法。

写了BingoneMap,其中使用Set存储监听器,在事件发生后执行监听器事件。基本要素是留一个口子给开发者实现该事件需执行怎么的操作。

同时注意数据之间的传递,监听器方法和调用者之间的数据交互。

package bingone;

import java.util.*;

/**
* Created by bingone on 16/3/21.
*/
public class BingoneMap<K, V> {
private Map<K, V> data = new HashMap<K, V>();
private Set<BingoneMapListener> listeners = new LinkedHashSet<BingoneMapListener>();

public V get(K key) {
for (BingoneMapListener b : listeners) {
b.commonJob(new BingoneMapListener.Event(key, BingoneMapListener.EnumEvent.GET));
}
System.out.println("Listener has been done");
return null == key ? null : data.get(key);
}

public void put(K key, V value) {
for (BingoneMapListener b : listeners) {
b.commonJob(new BingoneMapListener.Event(key, BingoneMapListener.EnumEvent.PUT));
}
System.out.println("Listener has been done");
data.put(key, value);
}

public void addListener(BingoneMapListener bingoneMapListener) {
this.listeners.add(bingoneMapListener);
}

public static abstract class BingoneMapListener<T> {

public T retData;

public BingoneMapListener(T retData) {
this.retData = retData;
}

public void commonJob(Event event) {
System.out.println("now in " + this);
myJob(event);
System.out.println("now out " + this);
}

public abstract T myJob(Event event);

public static class Event<E> {
public E inputData;
public EnumEvent enumEvent;

public Event(E inputData, EnumEvent e) {
this.inputData = inputData;
this.enumEvent = e;
}

}

public enum EnumEvent {
PUT(), GET();
}
}

public static void main(String... args) {
BingoneMap<String, String> bm = new BingoneMap<String, String>();
final StringBuilder sb = new StringBuilder();
bm.addListener(new BingoneMapListener(sb) {
@Override public Object myJob(Event event) {
System.out.println("in listener");
if (event.enumEvent == EnumEvent.GET) {
System.out.println("get " + event.inputData + " at " + System.currentTimeMillis());
sb.append("get");
} else if (event.enumEvent == EnumEvent.PUT) {
System.out.println("put " + event.inputData + " at " + System.currentTimeMillis());
sb.append("put");
}
return "success";
}
});
bm.put("a", "b");
bm.get("a");
System.out.println(sb.toString());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: