在泛滥设计模式中,观察者模式堪称非常靠近咱们的生存,咱们身临其境,因而也最为相熟。
为何这样说,无妨咱们先粗略的看一下观察者模式的形容:
定义对象间的一种一对多的依赖关系,当一个对象的状态产生扭转时,所有依赖于它的对象都失去告诉并被自动更新
将内容分析开来,咱们失去几个要害内容:
- 一对多
- 对象状态扭转 (也就是内容发生变化)
- 所有依赖对象都失去告诉并被自动更新
翻译:老大给小弟发号命令,命令一公布,泛滥小弟立马收到老大新公布的音讯。
在生活中对于这种关系的利用也随处可见,比方教官对士兵,老师对学生,公众号对订阅者等等
惋惜,小弟常有,老大不常有。所以用老师和学生为例,讲述具体的代码实现。
设计思路
在课堂上,老师作为被学生察看的主题对应的身份为 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 ,编程界的沈腾,用乐观的心,撰写乏味的文章。\
如果这篇文章帮忙到你,请珍藏⭐点赞加关注,跟踪不迷路(◡‿◡)