在泛滥设计模式中,观察者模式堪称非常靠近咱们的生存,咱们身临其境,因而也最为相熟。

为何这样说,无妨咱们先粗略的看一下观察者模式的形容:

定义对象间的一种一对多的依赖关系,当一个对象的状态产生扭转时,所有依赖于它的对象都失去告诉并被自动更新

将内容分析开来,咱们失去几个要害内容:

  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("学完了,下课!!!!");    }}

运行后果:

联合测试代码,咱们能够看到,每当老师把音讯更新时,同学们能够主动接管到老师更新的内容,实现所谓:一对多,状态扭转,音讯更新。

我是 Haoo ,编程界的沈腾,用乐观的心,撰写乏味的文章。\
如果这篇文章帮忙到你,请珍藏⭐点赞加关注,跟踪不迷路(◡‿◡)