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