观察者模式入门

观察者模式是什么

观察者模式是一种行为设计模式,也被称为发布/订阅模式。在观察者模式中,对象间存在一对多的依赖关系,当一个对象发生改变时,其所有依赖者(观察者)都会收到通知并且自动刷新。

观察者模式的核心思想是定义了一个主题(Subject)和若干个观察者(Observer),当主题状态发生改变时,观察者可以自动更新。主题包含若干个观察者,主题状态的改变会通知所有的观察者,观察者对这个变化可以有所响应。

观察者模式中,抽象主题类负责管理所有的观察者并提供增加和删除观察者的方法,具体主题类继承抽象主题类并实现对应的方法;抽象观察者类负责定义更新接口,具体观察者类实现更新接口并定义具体的响应方法。观察者模式允许操作和对象之间的松散耦合,之间的交互通过抽象接口实现,使得观察者和被观察者能够独立地进行修改。

观察者模式常见的应用场景包括:监控系统、事件处理、消息订阅等方面,也是很多 GUI 工具包中的基本机制。它将具体主题类和观察者解耦,可以灵活地添加或删除观察者,实现接口的统一和各个类之间的松耦合。

为什么使用观察者模式

使用观察者模式的好处主要有以下几个方面:

1. 可扩展性比较好。在观察者模式中,可以灵活地向系统中添加新的观察者,从而增加系统的功能和性能,而无须修改原有系统的代码。

2. 易于维护和拓展代码。在观察者模式中,一个主题对象和多个观察者对象之间是松散耦合的关系,主题对象不需要知道观察者对象的具体实现,只需要知道观察者对象中的抽象接口即可,这样就可以很方便地添加、删除、查看主题对象的观察者对象。

3. 支持广播通信。在观察者模式中,主题对象可以把消息传递给所有的观察者对象,从而实现广播通信,提高系统的响应速度。

4. 观察者模式符合开闭原则。开闭原则指的是对扩展开放,对修改关闭,使用观察者模式可以很方便地添加新的观察者,从而满足开闭原则。

5. 观察者模式能够提高代码的灵活性。在观察者模式中,主题对象不需要知道观察者对象的具体实现,只需要知道观察者对象实现了指定的抽象接口,这样可以非常灵活地改变观察者对象的具体实现,而不会影响到主题对象的其他部分。同时,观察者模式使得主题对象能够以独立于观察者的方式改变自身状态,从而避免了在主题对象中同时维护多个状态和操作所带来的复杂性。

综上所述,观察者模式的使用能够提高代码的可扩展性、简化代码的维护和拓展、支持广播通信、符合开闭原则并提高代码的灵活性。

怎么使用观察者模式

使用观察者模式需要实现以下步骤:

1. 定义主题对象

首先需要定义一个主题对象,它负责管理所有的观察者对象,提供增加和删除观察者的方法,以及通知观察者的方法。

2. 定义观察者接口

观察者接口定义了主题对象发生变化时的应对方法。

3. 定义具体观察者类

根据具体的需求,可以定义不同的观察者类,每个观察者类实现观察者接口,并定义自己的观察者方法,以响应主题对象状态的变化。

4. 定义具体主题类

根据具体的需求,可以定义不同的主题类,每个主题类继承主题对象,实现具体的主题方法。

5. 在主程序中实例化主题对象和多个观察者对象,建立观察者和被观察者之间的关系。

6. 在主题对象发生变化时,调用通知方法,通知所有观察者对象做出相应的响应。

具体实现时,可以根据不同的编程语言和框架来实现观察者模式,其中比较常用的有 Java 中的 Observer 接口和 Observable 类,C# 中的 event 和 delegate,Python 中的消息机制和 JavaScript 中的订阅-发布模式等。

需要注意的是,观察者模式在实际应用中需要注意避免多级循环嵌套和过度通知等问题,以确保系统的稳定性和高效性。

观察者模式适用于哪些场景

观察者模式适用于以下场景:

1. 当一个对象的改变需要同时改变其他对象时,可以采用观察者模式。例如,当一个数据模型对象的状态发生变化时,需要通知其他的视图对象更新显示。

2. 当一个对象改变需要多个其他对象进行响应时,可以采用观察者模式。例如,当一个主题对象的状态发生变化时,需要通知多个观察者对象进行相应处理。

3. 当一个对象需要能够动态地添加、删除、查看某些对象时,可以采用观察者模式。例如,当一个游戏中的关卡可以被多个关卡观察者进行观察时,可以采用观察者模式。

4. 当一个对象需要能够将变化的状态通知给其他对象而又不希望与这些对象产生紧密的耦合关系时,可以采用观察者模式。例如,当一个邮件服务器需要将新邮件通知给多个客户端而不希望与客户端产生紧密的耦合关系时,可以采用观察者模式。

综上所述,观察者模式适用于当一个对象的状态改变需要通知多个其他对象,并且这些对象需要做出相应响应的场景。观察者模式能够解决对象之间的耦合性,使得对象之间的联系更加松散、灵活和可扩展。

观察者模式常见的面试题

1. 观察者模式的角色有哪些?

答:观察者模式中包含四个角色:抽象主题(Subject)、具体主题(ConcreteSubject)、抽象观察者(Observer)、具体观察者(ConcreteObserver)。其中,抽象主题定义了增加、删除、通知观察者的接口;具体主题继承抽象主题,负责维护观察者列表并通知观察者;抽象观察者定义了更新的接口;具体观察者实现了更新的方法。

2. 观察者模式和订阅-发布模式有什么区别?

答:观察者模式和订阅-发布模式都是处理对象之间的事件通知,但是它们的实现方式略有不同。观察者模式中,观察者和被观察者之间形成了一种一对多的关系,当被观察者的状态发生变化时,会通知所有的观察者进行处理。而订阅-发布模式中,事件的发布和订阅是通过一个“中介者”来实现的。发布者发布事件,中介者将事件交给订阅者进行处理。在订阅-发布模式中,发布者和订阅者之间没有直接的关系。

3. 观察者模式和回调有何区别?

答:观察者模式和回调可以看作是两种不同的设计方式。观察者模式是一种面向对象的设计模式,可以实现对象之间的事件通知。回调是一种面向过程的编程方式,是指在一个函数的执行过程中,调用另一个函数进行处理。回调和观察者模式都可以用来实现事件通知,但是它们的实现方式不同。在观察者模式中,观察者和被观察者之间形成了一种松耦合的关系,被观察者状态的改变不会直接调用观察者的方法。在回调中,被调用者需要明确知道回调函数的方法名和参数类型。

4. 观察者模式中如何解决循环依赖的问题?

答:在观察者模式中,如果出现循环依赖的问题,会导致两个或多个对象互相依赖,从而不能正确地向其他观察者通知事件。为了解决循环依赖的问题,可以使用“中介者”或者消息队列来解耦发布者和订阅者之间的关系,从而避免循环依赖的问题。此外,也可以使用异步通信的方式来解决循环依赖问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值