乐趣区

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

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

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

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

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

  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,编程界的沈腾,用乐观的心,撰写乏味的文章。\
如果这篇文章帮忙到你,请珍藏⭐点赞👍加关注👀,跟踪不迷路 (🌻◡‿◡)

退出移动版