1、被观察者
2、观察者
3、两者是独立的类
应用场景:监听器,发短信,发邮件,日志收集
public class Mouse extends EventLisenter {
public void click(){
System.out.println("鼠标单击");
this.trigger(MouseEventType.ON_CLICK);
}
private void doubleClick(){
System.out.println("鼠标双击");
this.trigger(MouseEventType.ON_DOUBLE_CLICK);
}
public void up(){
System.out.println("鼠标弹起");
this.trigger(MouseEventType.ON_UP);
}
public void down(){
System.out.println("鼠标按下");
this.trigger(MouseEventType.ON_DOWN);
}
public void wheel(){
System.out.println("鼠标滚动");
this.trigger(MouseEventType.ON_WHEEL);
}
public void move(){
System.out.println("鼠标移动");
this.trigger(MouseEventType.ON_MOVE);
}
public void over(){
System.out.println("鼠标悬停");
this.trigger(MouseEventType.ON_OVER);
}
public static void main(String[] args){
try {
Mouse.class.getMethod("wheel").invoke(Mouse.class.newInstance());
Method[] me = Mouse.class.getMethods();
Method[] deMe = Mouse.class.getDeclaredMethods();
for (Method method : me) {
System.out.println(method.getName());
}
System.out.println("+++++++++++++++++++++");
for (Method method : deMe) {
System.out.println(method.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class MouseEventCallback {
private void onClick(Event e){
System.out.println("这是鼠标单击以后要执行的逻辑");
System.out.println("=======触发鼠标单击事件========\n" + e);
}
private void onDoubleClick(Event e){
System.out.println("=======触发鼠标双击事件========\n" + e);
}
private void onUp(Event e){
System.out.println("=======触发鼠标弹起事件========\n" + e);
}
private void onDown(Event e){
System.out.println("=======触发鼠标按下事件========\n" + e);
}
private void onMove(Event e){
System.out.println("=======触发鼠标移动事件========\n" + e);
}
private void onWheel(Event e){
System.out.println("=======触发鼠标滚动事件========\n" + e);
}
private void onOver(Event e){
System.out.println("=======触发鼠标悬停事件========\n" + e);
}
}
public enum MouseEventType {
ON_CLICK,
ON_DOUBLE_CLICK,
ON_UP,
ON_DOWN,
ON_WHEEL,
ON_MOVE,
ON_OVER;
}
=========== =========== =========== =========== =========== =========== =========== =========== ====下面两个是核心类
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;
}
public Object getSource() {
return source;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Method getCallback() {
return callback;
}
public void setCallback(Method callback) {
this.callback = callback;
}
public String getTrigger() {
return trigger;
}
@Override
public String toString() {
return "Event{" +
"\n\tsource=" + source + ",\n" +
"\ttarget=" + target + ",\n" +
"\tcallback=" + callback + ",\n" +
"\ttrigger='" + trigger + '\'' + "\n" +
'}';
}
public long getTime() {
return time;
}
Event setTime(long time) {
this.time = time;
return this;
}
Event setSource(Object source) {
this.source = source;
return this;
}
Event setTrigger(String trigger) {
this.trigger = trigger;
return this;
}
}
public class EventLisenter {
//Map相当于是一个注册器
protected Map<Enum,Event> events = new HashMap<Enum,Event>();
public void addLisenter(Enum eventType,Object target,Method callback){
//注册事件
//用反射调用这个方法
events.put(eventType,new Event(target,callback));
}
protected void trigger(Enum call){
if(!this.events.containsKey(call)){ return ;}
Event e = this.events.get(call).setTrigger(call.toString());
e.setSource(this);
e.setTime(System.currentTimeMillis());
try {
Method me = e.getCallback();
me.setAccessible(true);
me.invoke(e.getTarget(),e);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
=========== =========== =========== ===========
测试类:
public class MouseTest {
public static void main(String[] args) {
/*
* var input = document.getElementById("username");
* input.addLisenter("click",function(){
* alert("鼠标点击了这个文本框");
* });
* */
//观察者和被观察者之间没有必然联系
//注册的时候,才产生联系
//解耦
try {
MouseEventCallback callback = new MouseEventCallback();
Method onClick = callback.getClass().getDeclaredMethod("onClick", Event.class);
//人为的调用鼠标的单击事件
Mouse mouse = new Mouse();
mouse.addLisenter(MouseEventType.ON_CLICK, callback,onClick);
mouse.click();
}catch (Exception e){
e.printStackTrace();
}
}
}