1 代码演练
1.1 代码演练1(一对一观察)
1.2 代码演练2(一对多观察)
1.3 代码演练3(多对多观察)
1 代码演练
1.1 代码演练1(一对一观察)
需求:
木木网课程系统,教师后台提醒功能,当对应课程收到提问时,系统能给对应教师发出提醒
注意:
a 设计的时候,可以分为教师类,课程类和问题类。课程类作为被观察者,教师类作为观察者,问题类作为被观察者的一个参数。
b 根据系统已经有jdk提供的两个类 Observable(作为被观察者要继承的类)和 Observer(作为被观察者实现要实现的类)。我们能够轻松实现功能。
uml类图:
测试类:
package com.geely.design.pattern.behavioral.observer; public class Test { public static void main(String [] args){ Teacher teacher = new Teacher("李大霄"); Course course = new Course(); course.setCourseName("基金定投"); //基金定投课程添加添加观察者 李大霄老师 course.addObserver(teacher); Question question = new Question(); question.setUserName("乐于助人的丽娜"); question.setQuestionContent("老师您好,什么时候才能止盈啊?"); course.produceQuestion(course,question); } }
教师类:
package com.geely.design.pattern.behavioral.observer; import java.util.Observable; import java.util.Observer; public class Teacher implements Observer { private String teacherName; public Teacher(String teacherName) { this.teacherName = teacherName; } public String getTeacherName() { return teacherName; } /** * 被观察者为 Observable o,被观察者参数为 Object arg * @param o * @param arg */ @Override public void update(Observable o, Object arg) { Course course = (Course) o;//之所以能这样调,是因为Course 继承了 Observable Question question = (Question) arg; System.out.println(teacherName+"老师的"+course.getCourseName()+"课程中收到一条关于"+question.getQuestionContent()+"的问题,该问题的提出者为"+question.getUserName()); } }
课程类:
package com.geely.design.pattern.behavioral.observer; import java.util.Observable; public class Course extends Observable { private String courseName; public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public void produceQuestion(Course course,Question question){ System.out.println(course.getCourseName()+"课程中收到一条问题,该问题内容为"+question.getQuestionContent()); //以下两行添加后可以通知观察者,调观察者的update方法 setChanged(); notifyObservers(question); } }
问题类:
package com.geely.design.pattern.behavioral.observer; public class Question { private String userName; private String questionContent; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getQuestionContent() { return questionContent; } public void setQuestionContent(String questionContent) { this.questionContent = questionContent; } }
打印日志:
基金定投课程中收到一条问题,该问题内容为老师您好,什么时候才能止盈啊?
李大霄老师的基金定投课程中收到一条关于老师您好,什么时候才能止盈啊?的问题,该问题的提出者为乐于助人的丽娜
Process finished with exit code 0
1.2 代码演练2(一对多观察)
测试类:
package com.geely.design.pattern.behavioral.observer; public class Test { /*public static void main(String [] args){ Teacher teacher = new Teacher("李大霄"); Course course = new Course(); course.setCourseName("基金定投"); //基金定投课程添加添加观察者 李大霄老师 course.addObserver(teacher); Question question = new Question(); question.setUserName("乐于助人的丽娜"); question.setQuestionContent("老师您好,什么时候才能止盈啊?"); course.produceQuestion(course,question); }*/ public static void main(String [] args){ Teacher teacher = new Teacher("李大霄"); Teacher teacher2 = new Teacher("肖志刚"); Course course = new Course(); course.setCourseName("基金定投"); //基金定投课程添加添加观察者 李大霄老师 course.addObserver(teacher); course.addObserver(teacher2); Question question = new Question(); question.setUserName("乐于助人的丽娜"); question.setQuestionContent("老师您好,什么时候才能止盈啊?"); course.produceQuestion(course,question); } }
打印日志:
基金定投课程中收到一条问题,该问题内容为老师您好,什么时候才能止盈啊?
肖志刚老师的基金定投课程中收到一条关于老师您好,什么时候才能止盈啊?的问题,该问题的提出者为乐于助人的丽娜
李大霄老师的基金定投课程中收到一条关于老师您好,什么时候才能止盈啊?的问题,该问题的提出者为乐于助人的丽娜
Process finished with exit code 0
1.3 代码演练3(多对多观察)
测试类:
package com.geely.design.pattern.behavioral.observer; public class Test { /*public static void main(String [] args){ Teacher teacher = new Teacher("李大霄"); Course course = new Course(); course.setCourseName("基金定投"); //基金定投课程添加添加观察者 李大霄老师 course.addObserver(teacher); Question question = new Question(); question.setUserName("乐于助人的丽娜"); question.setQuestionContent("老师您好,什么时候才能止盈啊?"); course.produceQuestion(course,question); }*/ /*public static void main(String [] args){ Teacher teacher = new Teacher("李大霄"); Teacher teacher2 = new Teacher("肖志刚"); Course course = new Course(); course.setCourseName("基金定投"); //基金定投课程添加添加观察者 李大霄老师 course.addObserver(teacher); course.addObserver(teacher2); Question question = new Question(); question.setUserName("乐于助人的丽娜"); question.setQuestionContent("老师您好,什么时候才能止盈啊?"); course.produceQuestion(course,question); }*/ public static void main(String [] args){ Teacher teacher = new Teacher("李大霄"); Teacher teacher2 = new Teacher("肖志刚"); Course course = new Course(); course.setCourseName("基金定投"); Course course2 = new Course(); course2.setCourseName("基金加减仓策略"); //基金定投课程添加添加观察者 李大霄老师 course.addObserver(teacher); course2.addObserver(teacher2); Question question = new Question(); question.setUserName("乐于助人的丽娜"); question.setQuestionContent("老师您好,什么时候才能止盈啊?"); Question question2 = new Question(); question2.setUserName("加加减减"); question2.setQuestionContent("老师您好,踏空了怎么办?"); course.produceQuestion(course,question); course2.produceQuestion(course2,question2); } }
打印日志:
基金定投课程中收到一条问题,该问题内容为老师您好,什么时候才能止盈啊?
李大霄老师的基金定投课程中收到一条关于老师您好,什么时候才能止盈啊?的问题,该问题的提出者为乐于助人的丽娜
基金加减仓策略课程中收到一条问题,该问题内容为老师您好,踏空了怎么办?
肖志刚老师的基金加减仓策略课程中收到一条关于老师您好,踏空了怎么办?的问题,该问题的提出者为加加减减
Process finished with exit code 0
诸葛