《设计模式就该这样学》之基于Guava API实现异步通知和事件回调

}

创建Event类。

/**

  • 标准事件源格式的定义

  • Created by Tom.

*/

public class Event {

//事件源,动作是由谁发出的

private Object source;

//事件触发,要通知谁(观察者)

private EventListener target;

//观察者的回应

private Method callback;

//事件的名称

private String trigger;

//事件的触发事件

private long time;

public Event(EventListener target, Method callback) {

this.target = target;

this.callback = callback;

}

public Object getSource() {

return source;

}

public Event setSource(Object source) {

this.source = source;

return this;

}

public String getTrigger() {

return trigger;

}

public Event setTrigger(String trigger) {

this.trigger = trigger;

return this;

}

public long getTime() {

return time;

}

public Event setTime(long time) {

this.time = time;

return this;

}

public Method getCallback() {

return callback;

}

public EventListener getTarget() {

return target;

}

@Override

public String toString() {

return “Event{” +

“source=” + source +

“, target=” + target +

“, callback=” + callback +

“, trigger='” + trigger + ‘’’ +

“, time=” + time +

‘}’;

}

}

创建EventContext类。

/**

  • 被观察者的抽象

  • Created by Tom.

*/

public abstract class EventContext {

protected Map<String,Event> events = new HashMap<String,Event>();

public void addListener(String eventType, EventListener target, Method callback){

events.put(eventType,new Event(target,callback));

}

public void addListener(String eventType, EventListener target){

try {

this.addListener(eventType, target,

target.getClass().getMethod(“on”+toUpperFirstCase(eventType), Event.class));

}catch (NoSuchMethodException e){

return;

}

}

private String toUpperFirstCase(String eventType) {

char [] chars = eventType.toCharArray();

chars[0] -= 32;

return String.valueOf(chars);

}

private void trigger(Event event){

event.setSource(this);

event.setTime(System.currentTimeMillis());

try {

if (event.getCallback() != null) {

//用反射调用回调函数

event.getCallback().invoke(event.getTarget(), event);

}

}catch (Exception e){

e.printStackTrace();

}

}

protected void trigger(String trigger){

if(!this.events.containsKey(trigger)){return;}

trigger(this.events.get(trigger).setTrigger(trigger));

}

}

然后创建MouseEventType接口。

/**

  • Created by Tom.

*/

public interface MouseEventType {

//单击

String ON_CLICK = “click”;

//双击

String ON_DOUBLE_CLICK = “doubleClick”;

//弹起

String ON_UP = “up”;

//按下

String ON_DOWN = “down”;

//移动

String ON_MOVE = “move”;

//滚动

String ON_WHEEL = “wheel”;

//悬停

String ON_OVER = “over”;

//失去焦点

String ON_BLUR = “blur”;

//获得焦点

String ON_FOCUS = “focus”;

}

创建Mouse类。

/**

  • 具体的被观察者

  • Created by Tom.

*/

public class Mouse extends EventContext {

public void click(){

System.out.println(“调用单击方法”);

this.trigger(MouseEventType.ON_CLICK);

}

public 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 move(){

System.out.println(“调用移动方法”);

this.trigger(MouseEventType.ON_MOVE);

}

public void wheel(){

System.out.println(“调用滚动方法”);

this.trigger(MouseEventType.ON_WHEEL);

}

public void over(){

System.out.println(“调用悬停方法”);

this.trigger(MouseEventType.ON_OVER);

}

public void blur(){

System.out.println(“调用获得焦点方法”);

this.trigger(MouseEventType.ON_BLUR);

}

public void focus(){

System.out.println(“调用失去焦点方法”);

this.trigger(MouseEventType.ON_FOCUS);

}

}

创建回调方法MouseEventLisenter类。

/**

  • 观察者

  • Created by Tom.

*/

public class MouseEventListener implements EventListener {

public void onClick(Event e){

System.out.println(“=触发鼠标单击事件” + “\n” + e);

}

public void onDoubleClick(Event e){

System.out.println(“=触发鼠标双击事件” + “\n” + e);

}

public void onUp(Event e){

System.out.println(“=触发鼠标弹起事件” + “\n” + e);

}

public void onDown(Event e){

System.out.println(“=触发鼠标按下事件” + “\n” + e);

}

public void onMove(Event e){

System.out.println(“=触发鼠标移动事件” + “\n” + e);

}

public void onWheel(Event e){

System.out.println(“=触发鼠标滚动事件” + “\n” + e);

}

public void onOver(Event e){

System.out.println(“=触发鼠标悬停事件” + “\n” + e);

}

public void onBlur(Event e){

System.out.println(“=触发鼠标失去焦点事件” + “\n” + e);

}

public void onFocus(Event e){

System.out.println(“=触发鼠标获得焦点事件” + “\n” + e);

}

}

最后编写客户端测试代码。

public static void main(String[] args) {

EventListener listener = new MouseEventListener();

Mouse mouse = new Mouse();

mouse.addListener(MouseEventType.ON_CLICK,listener);

mouse.addListener(MouseEventType.ON_MOVE,listener);

最后

==========" + “\n” + e);

}

public void onFocus(Event e){

System.out.println(“=触发鼠标获得焦点事件” + “\n” + e);

}

}

最后编写客户端测试代码。

public static void main(String[] args) {

EventListener listener = new MouseEventListener();

Mouse mouse = new Mouse();

mouse.addListener(MouseEventType.ON_CLICK,listener);

mouse.addListener(MouseEventType.ON_MOVE,listener);

最后

[外链图片转存中…(img-hIvIGNaB-1714488684819)]

[外链图片转存中…(img-BESvBCW5-1714488684820)]

[外链图片转存中…(img-NZpc8UcA-1714488684820)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值