加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜新站长网 (https://www.0418zz.cn/)- 基础存储、数据处理、视频终端、内容创作、网络安全!
当前位置: 首页 > 服务器 > 安全 > 正文

监听器模式和观察者模式的关系,写点你不了解的

发布时间:2021-06-08 18:10:36 所属栏目:安全 来源:互联网
导读:先聊聊设计模式 为什么要使用监听模式,直接调用不好吗?这我们就要说说设计模式的好处了。设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码
先聊聊设计模式
为什么要使用监听模式,直接调用不好吗?这我们就要说说设计模式的好处了。设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。同时,采用设计模式之后,代码能够达到低耦合、低依赖的效果。
也就是说,即便不用设计模式,直接硬编码也能实现。但如果考虑到代码的耦合性、依赖性、扩展性等问题,设计模式便是更好的选择。比如观察者模式就能达到解耦、异步等效果。
观察者模式的定义
观察者模式定义了对象之间的一对多依赖,即一个主题对应多个观察者。当一个主题对象改变状态时,它的所有依赖者(观察者)都会收到通知并自动更新。比如用户订阅某个订阅号或公众号,当发新消息时,会发送给所有订阅者。
 
观察者模式解决的是对象和对象之间的依赖关系。当多个对象依赖一个对象的关系时,一个主题对象状态改变,需要通知所有观察者对象。
监听器模式并不是一个新的设计模式,它是观察者模式在特定场景下的一种改造和应用。通常,观察者模式的主题在通知观察者时,通知中不包含任何信息。如果这个过程中携带了一些其他信息,那么主题本身就成为了事件源,而携带信息的封装类就成为了事件。此时的观察者模式,也就升级为监听器了。监听器模式是观察者模式的另一种形态。
观察者模式实例
先来看看观察者模式的代码实现,可以直接使用JDK自带的Observer,也可以自定义对应的API。单从JDK自带观察者模式的API,也可以看出该设计模式的分量(虽然在Java被废弃了)。
我们这里采用自定义相关类,主要包括主题和观察者两种对象。
首先定义一个主题对应的接口Subject:
public interface Subject { 
 
    /** 
     * 注册定义 
     */ 
    void registerObserver(Observer observer); 
 
    /** 
     * 发送通知 
     */ 
    void notifyObservers(Object msg); 
 
主题接口中定义了两个方法一个用来注册观察者,一个用来发送通知。定义这个主题的具体实现类ConcreteSubject:
public class ConcreteSubject implements Subject { 
 
    /** 
     * 观察者集合 
     */ 
    private List<Observer> observers = new ArrayList<>(); 
 
    @Override 
    public void registerObserver(Observer observer) { 
        // 添加订阅关系 
        observers.add(observer); 
    } 
 
    @Override 
    public void notifyObservers(Object msg) { 
        // 通知订阅者 
        for (Observer observer : observers) { 
            observer.update(msg); 
        } 
    } 
实现类中存储了,观察者的集合,这样就实现了主题和观察者之间一对多的关系。
创建一个观察者接口Observer,方便管理:
public interface Observer { 
    // 处理业务逻辑 
    void update(Object msg); 
定义观察者接口的具体实现类ConcreteObserver:
public class ConcreteObserver implements Observer { 
 
    @Override 
    public void update(Object msg) { 
        // 业务逻辑实现 
        System.out.println("ConcreteObserver 接收到主题的消息: " + msg); 
    } 
在实现类中,打印一行消息。当然,在实践的过程中,这个实现类可以通过匿名类的形式创建,这样就具体的匿名类就在registerObserver时定义了。
下面来测试一下:
public class ConcreteObserver implements Observer { 
 
    @Override 
    public void update(Object msg) { 
        // 业务逻辑实现 
        System.out.println("ConcreteObserver 接收到主题的消息: " + msg); 
    } 
执行程序,打印结果:
ConcreteObserver 接收到主题的消息: 来自Subject的消息 
说明可以正常接收到主题发布的消息。
在上面的实现中,可以看出已经达到了解耦合的效果,同时减少了依赖关系。每个观察者根本不需要知道发布者处理了什么业务逻辑,也不依赖于发布者的业务模型,只关心自己的逻辑处理即可。

(编辑:阜新站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读