拿一个listener举例,subject是被观察的对象,Observer是观察者
event是事件,EventLisenter是事件注册和监听。
事件类的代码如下:
public class Event {
//事件源
private Object source;
//通知目标
private Object target;
//回调
private Method callback;
//触发
private String trigger;
private long time;
public Event(Object target, Method callback) {
this.target = target;
this.callback = callback;
}
//此处省去set get方法
}
事件类型枚举
public enum SubjectEventType {
ON_ADD,
ON_RMOVE,
ON_EDIT,
ON_QUERY;
}
EventLisenter类
/**
* 事件的注册和监听
*/
public class EventLisenter {
//Map相当于是一个注册器,什么事件触发什么方法放入该容器内
protected Map<Enum,Event> events = new HashMap<Enum,Event>();
//参数说明:1.什么事情;2.观察者是谁;3.调用观察者的什么方法
public void addLisenter(Enum eventType,Object target,Method callback){
//注册事件
//用反射调用这个方法
events.put(eventType,new Event(target,callback));
}
private void trigger(Event e){
e.setSource(this);
e.setTime(System.currentTimeMillis());
try {
e.getCallback().invoke(e.getTarget(),e);
} catch (Exception e1) {
e1.printStackTrace();
}
}
protected void trigger(Enum call){
if(!this.events.containsKey(call)){ return ;}
trigger(this.events.get(call).setTrigger(call.toString()));
}
}
被观察的类subject(继承时间监听类,并在自己的方法里,加入事件触发的方法):
public class Subject extends EventLisenter{
//通常的话,采用动态里来实现监控,避免了代码侵入
public void add(){
System.out.println("调用添加的方法");
trigger(SubjectEventType.ON_ADD);
}
public void remove(){
System.out.println("调用删除的方法");
trigger(SubjectEventType.ON_RMOVE);
}
}
客户端测试类:
public class ObserverTest {
public static void main(String[] args) {
try{
//观察者
Observer observer = new Observer();
Method advice = Observer.class.getMethod("advice", new Class<?>[]{Event.class});
//创建被观察者
Subject subject = new Subject();
//添加事件
subject.addLisenter(SubjectEventType.ON_ADD,observer,advice);
subject.addLisenter(SubjectEventType.ON_EDIT,observer,advice);
subject.addLisenter(SubjectEventType.ON_RMOVE,observer,advice);
subject.addLisenter(SubjectEventType.ON_QUERY,observer,advice);
//调用下面的方法,观察者会调用之前添加的事件
subject.add();
subject.remove();
}catch (Exception e){
e.printStackTrace();
}
}
}