软件设计模式系列之二十一——观察者模式

这篇具有很好参考价值的文章主要介绍了软件设计模式系列之二十一——观察者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 观察者模式的定义

观察者模式(Observer Pattern)是一种行为型设计模式,它允许对象之间建立一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这个模式也被称为发布-订阅模式,因为它模拟了一个主题(发布者)与多个观察者(订阅者)之间的关系。

观察者模式主要用于实现对象之间的解耦,使得被观察者(主题)和观察者之间的交互更加灵活。它是一种广泛应用于软件开发中的设计模式,常见于图形界面开发、事件处理系统和分布式系统中。

2 举例说明

为了更好地理解观察者模式,让我们考虑一个实际的例子:天气站。假设我们有一个天气站应用程序,用户可以订阅该应用程序以获取实时天气更新。在这个场景中,天气站就是被观察者(主题),而订阅天气更新的用户就是观察者(订阅者)。
软件设计模式系列之二十一——观察者模式

当天气站收到新的天气数据时,它会通知所有订阅者,以便它们可以更新显示当前天气的界面。这种方式使得用户可以实时获取最新的天气信息,而无需反复查询。

3 结构

观察者模式的结构包括以下几个要素:
软件设计模式系列之二十一——观察者模式

Subject(主题):主题是被观察的对象,它维护一组观察者,提供方法来添加和删除观察者,并在状态发生变化时通知观察者。
ConcreteSubject(具体主题):具体主题是主题的具体实现,它包含了真正的状态和状态变化逻辑。
Observer(观察者):观察者是订阅主题的对象,它定义了一个更新接口,以便主题在状态变化时通知观察者。
ConcreteObserver(具体观察者):具体观察者是观察者的具体实现,它实现了更新接口,以便在接收到通知时执行相应的操作。

4 实现步骤

观察者模式的实现步骤如下:

创建主题接口(Subject),定义添加、删除和通知观察者的方法。
创建具体主题类(ConcreteSubject),实现主题接口,并维护观察者列表和状态变量。
创建观察者接口(Observer),定义更新方法。
创建具体观察者类(ConcreteObserver),实现观察者接口,并定义具体的更新逻辑。
在客户端中创建主题对象和观察者对象,将观察者注册到主题上。
当主题的状态发生变化时,调用主题的通知方法,通知所有注册的观察者。
观察者接收到通知后,执行相应的更新操作。

5 代码实现(Java)

让我们通过一个简单的 Java 代码示例来演示观察者模式的实现。

// Step 1: 创建主题接口
interface Subject {
    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// Step 2: 创建具体主题类
class WeatherStation implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String weatherData;

    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(weatherData);
        }
    }

    public void setWeatherData(String data) {
        this.weatherData = data;
        notifyObservers();
    }
}

// Step 3: 创建观察者接口
interface Observer {
    void update(String data);
}

// Step 4: 创建具体观察者类
class User implements Observer {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(String data) {
        System.out.println(name + " 收到天气更新:" + data);
    }
}

// Step 5: 客户端代码
public class Main {
    public static void main(String[] args) {
        WeatherStation weatherStation = new WeatherStation();

        User user1 = new User("Alice");
        User user2 = new User("Bob");

        weatherStation.addObserver(user1);
        weatherStation.addObserver(user2);

        weatherStation.setWeatherData("晴天");
        weatherStation.setWeatherData("下雨");
    }
}

在上面的示例中,WeatherStation 是具体主题,User 是具体观察者。当天气发生变化时,WeatherStation 通知所有注册的观察者,观察者执行相应的更新操作。

6 典型应用场景

观察者模式在许多应用场景中都得到了广泛的应用,包括以下一些场景:

股票市场:投资者可以订阅股票价格的变化。一旦股票价格发生变化,所有订阅了该股票的投资者都会立即收到通知,以便他们可以做出及时的投资决策。
软件设计模式系列之二十一——观察者模式

社交媒体:社交媒体平台中,用户可以关注其他用户的动态。当被关注用户发布新的动态、照片或视频时,关注者会收到通知,以便互动和评论。

库存管理:在库存管理系统中,订阅者可以订阅特定商品的库存变化。当库存数量发生变化时,订阅者可以收到通知,帮助他们及时补充库存或采取其他措施。

观察者模式将主题和观察者解耦,使主题可以轻松通知多个观察者,而观察者可以根据自己的需求选择订阅感兴趣的主题。这种模式提高了系统的灵活性和可扩展性,使信息传递更加高效和及时

7 优缺点

观察者模式的优点包括:

解耦性:被观察者和观察者之间的关系是松散耦合的,可以独立地改变它们中的任何一个,而不会影响其他部分。
可扩展性:可以轻松地添加新的观察者,扩展系统功能。
通知机制:观察者能够实时获取到被观察者的状态变化,无需主动轮询。
可维护性:代码易于维护和理解,因为逻辑分散在各个观察者中。

观察者模式的缺点包括:

如果观察者过多,通知所有观察者可能会导致性能问题。
如果观察者之间有依赖关系,可能会引入复杂性。
如果不正确地实现,可能会导致循环引用。

8 类似模式

观察者模式建立了一种一对多的依赖关系,其中一个对象(被观察者)维护一组依赖它的对象(观察者),并在状态变化时通知观察者。与观察者模式类似的模式有以下几种,它们在某些方面具有相似性,但也存在一些区别:

委托模式(Delegate Pattern):

委托模式也允许一个对象委托给多个对象,类似于观察者模式中的通知多个观察者。 在委托模式中,被委托的对象通常不知道委托它的对象,而观察者模式中,被观察者知道它的观察者并主动通知它们。委托模式通常用于事件处理和回调机制,而观察者模式用于状态变化通知。

策略模式(Strategy Pattern):

策略模式和观察者模式都关注对象之间的交互,但在策略模式中,可以根据需要切换不同的算法或行为,而观察者模式关注对象状态的变化通知。观察者模式通常用于对象之间的一对多关系,而策略模式用于定义一组可互换的算法,客户端可以在运行时选择其中一个算法。

命令模式(Command Pattern):

命令模式和观察者模式都涉及到将请求发送给接收者对象,但观察者模式关注状态变化的通知,而命令模式关注封装请求成对象。在观察者模式中,被观察者通知观察者状态的改变,而在命令模式中,客户端创建命令对象并将其发送给接收者,接收者执行命令。

这些模式都有共同点,即它们都有助于降低对象之间的耦合度,并提供了一种松散的交互方式。然而,它们的重点和用途有所不同,因此在设计应用程序时,需要根据具体需求选择最合适的模式。

9 小结

观察者模式是一种有用的设计模式,它可以帮助我们实现对象之间的松散耦合,使系统更加灵活和可扩展。通过定义一对多的依赖关系,观察者模式允许被观察者在状态变化时通知所有观察者,实现了一种高效的通知机制。在实际应用中,观察者模式可以用于各种领域,包括图形界面开发、事件处理系统、消息队列和实时数据更新等。要成功使用观察者模式,需要谨慎设计接口和类,并确保正确地管理观察者的注册和通知。文章来源地址https://www.toymoban.com/news/detail-710306.html

到了这里,关于软件设计模式系列之二十一——观察者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件设计模式系列之二十五——访问者模式

    访问者模式(Visitor Pattern)是一种强大的行为型设计模式,它允许你在不改变被访问对象的类的前提下,定义新的操作和行为。本文将详细介绍访问者模式,包括其定义、举例说明、结构、实现步骤、Java代码实现、典型应用场景、优缺点、类似模式以及最后的小结。 访问者

    2024年02月08日
    浏览(73)
  • 软件设计模式系列之十一——装饰模式

    当谈到设计软件系统时,经常需要考虑如何使系统更加灵活、可扩展和易维护。设计模式是一种被广泛采用的方法,用于解决常见的设计问题,并提供了一套可重用的解决方案。装饰模式(Decorator Pattern)是一种结构型设计模式,它允许您在不改变对象接口的情况下动态地添

    2024年02月08日
    浏览(30)
  • 设计模式(二十一)策略

    定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。策略模式是一种对象行为型模式,又称为政策(Policy)模式。 包含以下三个角色: 1、Context(环境类): 环境类是使用算法的角色,它在解决某个问题(即实

    2024年02月01日
    浏览(27)
  • 设计模式二十一:状态模式(State Pattern)

    一个对象的内部状态发生变化时,允许对象改变其行为。这种模式使得一个对象看起来好像在运行时改变了它的类,主要目的是将状态的行为从主要对象中分离出来,使得主要对象不必包含所有状态的逻辑,而是将每个状态的行为封装在独立的类中。这有助于减少代码的重复

    2024年02月11日
    浏览(36)
  • 【中级软件设计师】—(针对上午题)二十三种设计模式(三十九)

    简单工厂模式代码实现如下: 📢 意图要背 工厂方法代码实现如下: 抽象工厂模式代码如下: 生成器模式代码如下: 原型模式代码实现如下: 单例模式代码如下: 桥接模式代码实现如下: 组合模式添加和删除代码实现: 装饰器模式代码实现: 外观模式代码实现: 代理模

    2024年02月07日
    浏览(37)
  • 软件设计模式系列之九——桥接模式

    桥接模式是一种结构型设计模式,它用于将抽象部分与其实现部分分离,以便它们可以独立地变化。这种模式涉及一个接口,它充当一个桥,使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系,从而减少类之间的紧密耦合度,使得系统更

    2024年02月08日
    浏览(31)
  • 软件设计模式系列之十——组合模式

    组合模式是一种结构型设计模式,用于将对象组合成树形结构以表示部分-整体层次结构。这个模式允许客户端以一致的方式处理单个对象和对象组合,因此它将单个对象和组合对象视为可互换的。 组合模式允许你将对象组合成树状结构来表示\\\"部分-整体\\\"的层次结构。组合模

    2024年02月08日
    浏览(32)
  • 软件设计模式系列之七——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新对象,这种方式可以避免对象的重复初始化,提高性能,并使对象的创建更加灵活和

    2024年02月08日
    浏览(33)
  • 软件设计模式系列之六——单例模式

    单例模式(Singleton Pattern)是一种常见的创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这意味着无论何时何地,只要需要该类的实例,都会返回同一个实例,而不是创建多个相同的实例。单例模式通常用于管理全局状态、资

    2024年02月07日
    浏览(28)
  • 软件设计模式系列之十四——代理模式

    代理模式是一种结构型设计模式,它允许一个对象(代理)充当另一个对象的接口,以控制对该对象的访问。代理模式通常用于控制对真实对象的访问,以实现一些额外的功能,例如延迟加载、权限控制、日志记录等。这种模式属于结构型设计模式,因为它关注对象之间的组

    2024年02月08日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包