设计模式之观察者模式ObserverPattern(十一)

一、概述

        观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

二、结构

在观察者模式中有如下角色:

  • Subject:观察对象,定义了注册观察者和删除观察者的方法。此外,它还声明了“获取现在的状态”的方法。
  • ConcreteSubject:具体观察对象,当自身状态发生变化后,它会通知所有已经注册的 Observer 角色。
  • Observer:抽象观察者,负责接收来自 Subject 角色的状态变化的通知,为此,它声明了 update 方法。
  • ConcrereObserver:具体观察者,当它的 update 方法被调用后,会去获取要观察的对象的最新状态。

三、代码实现

1、Observer

package com.xu.demo.observerPattern;

/**
 * 观察者接口
 */
public interface Observer {

    void update(String message);
}

2、ConcreteObserver

 

package com.xu.demo.observerPattern;

/**
 * 观察者实例
 */
public class ConcreteObserver implements Observer{

    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(name + ": " + message);
    }
}

3、Subject

package com.xu.demo.observerPattern;

/**
 * 主题接口
 */
public interface Subject {

    //添加订阅者(观察者对象)
    void attach(Observer observer);

    //删除订阅者
    void detach(Observer observer);

    //通知订阅者更新消息
    void notify(String message);
}

4、SubscriptionSubject

 

package com.xu.demo.observerPattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 主题操作类
 */
public class SubscriptionSubject implements Subject{

    //定义一个集合,用来存储多个观察者对象
    private List<Observer> observerList = new ArrayList<>();

    @Override
    public void attach(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notify(String message) {
        //遍历集合
        for (Observer observer : observerList) {
            //调用观察者对象中的 update 方法
            observer.update(message);
        }
    }
}

 5、ObserverPattern

 

 

package com.xu.demo.observerPattern;

public class ObserverPattern {

    public static void main(String[] args) {

        //1.创建主题对象
        SubscriptionSubject subject = new SubscriptionSubject();
        Observer ronnie = new ConcreteObserver("Ronnie");
        Observer ding = new ConcreteObserver("Ding");
        Observer trump = new ConcreteObserver("Trump");

        //2.观察者订阅主题
        subject.attach(ronnie);
        subject.attach(ding);
        subject.attach(trump);

        //3.更新主题
        subject.notify("Java专栏更新了!");

        System.out.println("====================我是分割线==================");
        //4.观察者取消订阅主题
        subject.detach(ding);
        subject.detach(trump);

        //5.更新主题
        subject.notify("Python专栏更新了!");

    }

}

运行结果:

至此,一个最简单的 发布-订阅 (Publish/Subscribe) 模式代码实例就完成了,大家认真理解好好体会,你也能成为IT高手,我们下回再见。

相关推荐

  1. 【前端设计模式观察模式

    2024-06-09 17:04:01       42 阅读
  2. 设计模式观察模式

    2024-06-09 17:04:01       33 阅读
  3. 设计模式观察模式

    2024-06-09 17:04:01       37 阅读
  4. 设计模式观察模式

    2024-06-09 17:04:01       34 阅读
  5. go 设计模式观察模式

    2024-06-09 17:04:01       31 阅读
  6. 设计模式观察模式

    2024-06-09 17:04:01       32 阅读

最近更新

  1. Apache Flink 任意 JAR 包上传漏洞利用及防范策略

    2024-06-09 17:04:01       0 阅读
  2. QTreeWidget 树遍历

    2024-06-09 17:04:01       0 阅读
  3. 技术浅谈:如何入门一门编程语言

    2024-06-09 17:04:01       1 阅读
  4. C#如何进行深度学习对行人进行识别?

    2024-06-09 17:04:01       1 阅读
  5. 金南瓜科技的SECS/GEM解决方案

    2024-06-09 17:04:01       1 阅读

热门阅读

  1. 006 RabbitMQ

    2024-06-09 17:04:01       13 阅读
  2. 记录一次jlink连不上cpu的情况

    2024-06-09 17:04:01       10 阅读
  3. wordpress网站建设详细过程

    2024-06-09 17:04:01       9 阅读
  4. 移动端前端开发遇到过的Andorid和IOS的差异记录

    2024-06-09 17:04:01       11 阅读
  5. Audio音频资源播放

    2024-06-09 17:04:01       12 阅读
  6. springboot + easyRules 搭建规则引擎服务

    2024-06-09 17:04:01       12 阅读
  7. AI学习的基础理论路径

    2024-06-09 17:04:01       9 阅读
  8. es6 proxy的作用和用法

    2024-06-09 17:04:01       10 阅读
  9. 简单记录个python国内镜像源

    2024-06-09 17:04:01       11 阅读