美文网首页
观察者模式:一个最贴近生活的设计模式

观察者模式:一个最贴近生活的设计模式

作者: 分布式与微服务 | 来源:发表于2023-02-23 09:21 被阅读0次

在众多设计模式中,观察者模式可谓十分接近我们的生活,我们身临其境,因此也最为熟悉。

为何这样说,不妨我们先粗略的看一下观察者模式的描述:

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

将内容剖析开来,我们得到几个关键内容:

  1. 一对多
  2. 对象状态改变 (也就是内容发生变化)
  3. 所有依赖对象都得到通知并被自动更新

翻译:老大给小弟发号命令,命令一发布,众多小弟立马收到老大新发布的消息。

在生活中对于这种关系的应用也随处可见,比如教官对士兵,老师对学生,公众号对订阅者等等

可惜,小弟常有,老大不常有。所以用老师和学生为例,讲述具体的代码实现。

设计思路

在课堂上,老师作为被学生观察的主题对应的身份为 Subject, 而学生作为观察者对应的身份为 Observer,这两个对应关系的正式称呼需要大家了解一下。

1. 首先创建 Subject 也就是 Teacher 类

  • 在 Teacher 类下创建一个集合,用于存放有哪些学生 (Observer) 在上老师的课
  • 定义一个 Message 作为老师将要传达给学生的信息
public class Teacher {
    private List<Student> students = new ArrayList<Student>();
    private String message;
}

  • 定义 addStudent 方法,将传过来的学生保存到集合中,这样老师才能知道有哪些学生在上他的课
public void addStudent(Student stu) {
    students.add(stu);
}

  • 定义 Get、Set 方法用来获取和设置 Message 内容
public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
    notifyAllStu();
}

  • 在 setMessage 方法中,Message 每被更新 ( 重新赋值 ),则更新的内容通过 notifyAllStu() 发送给学生,通过学生类中 accept() 方法,输出学生所接受到的内容。
private void notifyAllStu() {
   for (Student stu : students) {
       stu.accept();
   }
}

2. 定义 Observer 即 Student 抽象类,因为存在多个学生,每个学生都不相同。所以抽象出来,通过继承将学生具体化,实现多态。这样老师就不必在意具体是哪个学生,而是只要是学生,那么都可以上课

  • 定义 Teacher 表示学生选择的老师
  • 定义 accept 方法表明学生接受的消息内容
public abstract class Student {
 protected Teacher teacher;
 public abstract void accept();
}

使用抽象类而不使用接口的原因就是,抽象类我们可以在类里面定义属性和方法体,并通过子类继承实现赋值和重写,而接口无法达到我们设计的要求。

  • 继承 Student 实现具体 学生A 对象
  • 通过构造方法传入选择的老师,并调用 Teacher.addStudent() 将学生加入到老师的课堂名单中
public class StudentA extends Student {
    public StudentA(Teacher Teacher) {
        this.teacher = Teacher;
        Teacher.addStudent(this);
    }
    @Override
    public void accept() {
        System.out.println("StudentA 接收到了 Teacher 的知识点: "+this.teacher.getMessage());
    }
}

以此类推,我们实现A、B、C 三个学生。

3. 编写测试类

public class observeTest {
    public static void main(String[] args) {
        Teacher Teacher = new Teacher();
        StudentA studentA = new StudentA(Teacher);
        StudentB studentB = new StudentB(Teacher);
        StudentC studentC = new StudentC(Teacher);
        System.out.println("老师开始讲第一个知识点!");
        Teacher.setMessage("1+1=2");
        System.out.println("老师开始讲第二个知识点!");
        Teacher.setMessage("2+2=4");
        System.out.println("学完了,下课!!!!");
    }
}

运行结果:


结合测试代码,我们可以看到,每当老师把消息更新时,同学们可以自动接收到老师更新的内容,实现所谓:一对多,状态改变,消息更新。

相关文章

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • 三种方式实现观察者模式 及 Spring中的事件编程模型

    观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • 设计模式02-观察者者设计模式

    [toc] 设计模式02-观察者者设计模式 主要来源Head First设计模式(书)观察者设计模式是JDK中使用...

  • 设计模式(二)观察者模式

    1.前言 本期分享设计模式主题:观察者设计模式。 这是一个非常简单易学的设计模式,读完本文,你能知道观察者模式的设...

  • 别再面向 for 循环编程了,Spring 自带的观察者模式就很

    1. 概述 在设计模式中,观察者模式是一个比较常用的设计模式。维基百科解释如下: 观察者模式是软件设计模式的一种。...

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • Guava源码分析——EventBus

    EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。 1、程序示例...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

网友评论

      本文标题:观察者模式:一个最贴近生活的设计模式

      本文链接:https://www.haomeiwen.com/subject/fmfoartx.html