为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第19天+观察者模式区别

标签:
设计模式

课程名称:Java设计模式精讲 Debug方式+内存分析

课程章节: 观察者模式模式讲解+Coding+源码解析

主讲老师:Geely

课程内容:

图片描述

问题1)观察者模式和监听者模式区别?

观察者模式中分两个角色:观察者和被观察者。
监听者模式中分3个角色:事件源,事件对象,监听器。
图片描述
共同点:

  1. 其中事件源和事件对象组成了被观察者。
  2. 都是回调函数。注册到组件上,组件调用注册的对象上方法,这个方法就是回调函数。
  3. 都能广播。观察者模式可以单独

不同点:

  1. 角色不同。
  2. event-listener是传统的c/s界面事件模型,分事件源和事件(状态)角色,事件源要经过事件的包装、成为事件的属性之一再传递给事件监听/处理者,这个事件监听者就相当于观察者。
    监听器模式是观察者模式的另一种形态,同样基于事件驱动模型。监听器模式更加灵活,可以对不同事件作出相应。但也是付出了系统的复杂性作为代价的,因为我们要为每一个事件源定制一个监听器以及事件,这会增加系统的负担。

问题2)监听者模式的成员?

监听者模式中分3个角色:事件源,事件对象,监听器。

事件源:就是一个实体对象。(静态)
事件对象;就是对事件源的操作。(动态)
监听器:根据事件源和事件对象判断是否是监听的动作,再做出处理。
图片描述

问题3)监听者模式的调用过程?

事件源发布事件对象,给某个监听器,监听器根据事件类型和事件源,判断是否是自己要监听的。

事件源发布其实就是调用注册在它上面的监听器方法。

问题4)例子?

public class demo {
public static void main(String[] args) {
Event event = new Event();
eventSource eventSource = new eventSource();
doubleClickEventListener doubleClick = new doubleClickEventListener();
singleClickEventListener singleClick = new singleClickEventListener();

    event.setType("singleClick");     // 事件类型,单击对象
    eventSource.register(singleClick); // 注册单击事件
    eventSource.publishEvent(event); // 发布事件

    event.setType("doubleClick");     // 事件类型,双击对象
    eventSource.register(doubleClick); // 注册双击事件
    eventSource.publishEvent(event); // 发布事件
}

}

/** 监听器接口,一般监听器都是注册在事件源上 */
public interface eventListener {
// 传入事件
public void processEvent(Event event);

}

/** 事件监听器实现类 */
public class doubleClickEventListener implements eventListener{
@Override
public void processEvent(Event event) {
if (“doubleClick”.equals(event.getType())){
System.out.println(“双击事件。。。”);
}
}
}

/** 事件监听器实现类 */
public class singleClickEventListener implements eventListener{

@Override
public void processEvent(Event event) {
    if ("singleClick".equals(event.getType())){
        System.out.println("单击事件。。。");
    }
}

}

public class eventSource {
// 存在多个监听器
private List listeners = new ArrayList<>();

// 注册监听器
public void register(eventListener listener){
    listeners.add(listener);
}

// 根据不同的事件对象,调用对应监听器的方法,发布事件
public void publishEvent(Event event){
    for (eventListener listener:listeners){
        listener.processEvent(event);
    }
}

}

/**

  • 事件对象
    */
    @Getter
    @Setter
    public class Event {
    // 事件类型
    private String type;
    }图片描述
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消