【对象行为模式】二十三天学会设计模式之观察者模式

简介: 【对象行为模式】二十三天学会设计模式之观察者模式

一、什么是观察者模式

观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。

 

对于观察者模式而言,有两个对象,一个是观察者,一个是被观察者。

 

观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。UML结构图如下:

其中,各属性的定义:

  • Subject:被观察者
  • Observer:抽象观察者接口
  • ConcreteObserver:具体观察者,实现接口

二、为什么要用观察者模式?

大家在生活中可能都遇到这种问题:当孩子哭的时候,爸爸、妈妈应该第一时间收到消息,并且做出响应的对策。

如果我们不采取观察者模式,我们写出的代码可能是这种的:

这种代码在DadMum等观察者少量的时候还比较好用,当观察者的数量多起来,我们的类就会变得十分臃肿。

还有一个比较大的问题,对于观察者来说,不一定监控一个被观察者,可能同时监控多个被观察者,这样的话,我们上述简单的架构就会变得累赘。


原始的观察者模式在传递消息的时候,是通过观察者类和被观察者类之间的耦合通知,我们将消息的通知改为事件发送,也就是观察者和被观察者通过事件来进行通信。

三、如何实现观察者模式?

我们还是用上面小孩哭的例子,来进行一个架构图的绘制:

整体的思路:当我们的小孩哭了之后,会发送一个哭泣的消息事件,而我们的 observer 会监听这个事件并做出响应

Child:被观察者对象,发送哭泣的事件

class Child {
    private Boolean cry = false;
    private List<Observer> observers = new ArrayList<>();
    {
        observers.add(new Dad());
        observers.add(new Mum());
        observers.add(new Dog());
    }
    public boolean isCry() {
        return cry;
    }
    public void wakeUp() {
        cry = true;
        // 创建消息事件
        WakeUpEvent event = new WakeUpEvent(System.currentTimeMillis(), "bed", this);
        // 发送消息事件
        for (Observer observer : observers) {
            observer.actionOnWakeUp(event);
        }
    }
}

WakeUpEvent:事件发送事件、地点、事件源对象

class WakeUpEvent {
    long timestamp;
    String loc;
    // 事件源对象本身
    Child source;
    public WakeUpEvent(long timestamp, String loc, Child source) {
        this.timestamp = timestamp;
        this.loc = loc;
        this.source = source;
    }
}

Observer:观察者的接口

interface Observer {
    void actionOnWakeUp(WakeUpEvent event);
}

Dad:实现观察者接口,监听事件

class Dad implements Observer {
    public void feed() {
        System.out.println("dad feed");
    }
    @Override
    public void actionOnWakeUp(WakeUpEvent event) {
        feed();
    }
}

Test:测试

  public static void main(String[] args) {
        Child child = new Child();
        child.wakeUp();
        // dad feed
    // Mum bao
    // Dog wangwangwang
    }

四、总结

当我们想要一个对象状态改变,其他对象状态也跟着改变时,如果我们使用原始类耦合的做法,会造成我们的类显着特别的臃肿和难以维护。

这个时候,我们利用 观察者模式+事件机制,可以让我们整个系统的耦合度大大降低,并且在后续维护的过程中,也便于维护。

但是观察者也有一定的弊端,比如:

  • 我们的观察者并不知道被观察者做出了怎么样的改变,仅仅知道被观察者进行了变化
  • 一定避免循环观察,防止观察者和被观察者之间相互引用

相关文章
|
2月前
|
设计模式 监控 Java
Kotlin - 改良设计模式 - 观察者模式
Kotlin - 改良设计模式 - 观察者模式
56 3
|
6天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
12天前
|
设计模式 存储 供应链
前端必须掌握的设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,实现了一种订阅机制。它包含两个角色:**观察者**(订阅消息、接收通知并执行操作)和**被观察者**(维护观察者列表、发送通知)。两者通过一对多的关系实现解耦,当被观察者状态改变时,会通知所有订阅的观察者。例如,商店老板作为被观察者,记录客户的需求并在商品到货时通知他们。前端应用中,如DOM事件注册、MutationObserver等也体现了这一模式。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
4月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
3月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
54 0
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
41 1