监听者模式

2020-06-30  本文已影响0人  码而优则仕

监听者模式

回调函数:

事件监听器

监听器将监听自己感兴趣的事件,一旦事件发生,就会做出响应。

事件监听器涉及三个组件:

使用事件监听器模式可以节约代码,事件监听器事件源 是可以分开开发的。事件监听器事件源 之间使用 事件 进行联系

事件监听器 和 事件源,不用关心彼此实现。

事件监听器就是设计模式中 观察者模式 的实现

事件源,事件—观察者模式中的 主题组件

事件监听器—观察者模式中的 观察者

具体代码实现:

事件:

/**
 * @author wsq
 * @version Event.java  2020/6/30  上午8:29 下午
 * 事件对象--在事件源和事件监听器之间传递信息
 */
@Data
public class Event {

    private String type;
}

事件监听器接口定义:

/**
 * @author wsq
 * @version EventListener.java  2020/6/30  上午8:31 下午
 * 监听器接口,具体监听器需要实现这个接口
 */
public interface EventListener {

    void processEvent(Event event);

}

具体事件监听器

/**
 * @author wsq
 * @version SingleClickEventListener.java  2020/6/30  上午8:33 下午
 * 单击监听器接口
 */
public class SingleClickEventListener implements EventListener {

    @Override
    public void processEvent(Event event) {
        if ("singleClick".equals(event.getType())) {
            System.out.println("单击被触发");
        }
    }
}
/**
 * @author wsq
 * @version DoubleClickEventListener.java  2020/6/30  上午8:37 下午
 * 双击监听器接口
 */
public class DoubleClickEventListener implements EventListener {


    @Override
    public void processEvent(Event event) {
        if ("doubleClick".equals(event.getType())) {
            System.out.println("双击被触发");
        }
    }
}

事件源:

/**
 * @author wsq
 * @version EventSource.java  2020/6/30  上午8:36 下午
 * 事件源 -- 事件监听器 需要注册到事件源上,事件源有多个 使用 List 接收
 * 对外提供事件监听器注册接口
 * 发布事件
 */
public class EventSource {

    private List<EventListener> listeners = new ArrayList<>();

    /**
     * 对外暴露 注册 事件监听器的 口子
     *
     * @param listener
     */
    public void register(EventListener listener) {
        listeners.add(listener);
    }

    /**
     * 事件源发布事件
     *
     * @param event 事件源
     */
    public void publishEvent(Event event) {
        //对 注册到 事件源 的 不同事件监听器 都发布事件
        //由事件监听器决定是否响应事件 -- 即事件源发布的事件 是否是自己感兴趣的事件,是就做出响应,否则忽略
        for (EventListener listener : listeners) {
            listener.processEvent(event);
        }
    }


}

程序入口:

public class EventModeDemo {

    public static void main(String args[]) {
        EventSource source = new EventSource();
        SingleClickEventListener singleClickEventListener = new SingleClickEventListener();
        DoubleClickEventListener doubleClickEventListener = new DoubleClickEventListener();
        //往 事件源 注册不同的 事件监听器
        source.register(singleClickEventListener);
        source.register(doubleClickEventListener);
        // 对所有事件监听器 广播发布单击事件
        Event singleClickEvent = new Event();
        singleClickEvent.setType("singleClick");
        source.publishEvent(singleClickEvent);
    }
}

输出:

单击被触发

Process finished with exit code 0

上一篇 下一篇

猜你喜欢

热点阅读