观察者模式
1.定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,
当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。
2.类型:行为型
3.适用场景:关联行为场景,建立一套触发机制。
4.优点:观察者和被观察者之间建立一个抽象的耦合;观察者模式支持广播通信。
5.缺点:观察者之间有过多的细节依赖、提高时间消耗及程序复杂度;
使用要得当,要避免循环调用。
6.实例目录package

7.实例UML类图

8.代码
1 package com.geely.design.pattern.behavioral.observer; 2 3 import java.util.Observable; 4 5 public class Course extends Observable { 6 private String courseName; 7 8 public Course(String courseName) { 9 this.courseName = courseName; 10 } 11 12 public String getCourseName() { 13 return courseName; 14 } 15 16 public void produceQuestion(Course course,Question question){ 17 System.out.println(question.getUserName() + "在" + course.courseName +"提交了一个问题"); 18 setChanged(); 19 notifyObservers(question); 20 } 21 }
1 package com.geely.design.pattern.behavioral.observer; 2 3 public class Question { 4 private String userName; 5 private String questionContent; 6 7 public String getUserName() { 8 return userName; 9 } 10 11 public void setUserName(String userName) { 12 this.userName = userName; 13 } 14 15 public String getQuestionContent() { 16 return questionContent; 17 } 18 19 public void setQuestionContent(String questionContent) { 20 this.questionContent = questionContent; 21 } 22 }
1 package com.geely.design.pattern.behavioral.observer; 2 3 import java.util.Observable; 4 import java.util.Observer; 5 6 public class Teacher implements Observer { 7 private String teacherName; 8 9 public Teacher(String teacherName) { 10 this.teacherName = teacherName; 11 } 12 13 @Override 14 public void update(Observable o, Object arg) { 15 Course course = (Course) o; 16 Question question = (Question) arg; 17 System.out.println(teacherName + "老师的" + course.getCourseName()+ "课程接收到一个"
+ question.getUserName()+ "提交的问答:" + question.getQuestionContent()); 18 } 19 }
1 package com.geely.design.pattern.behavioral.observer; 2 3 public class Test { 4 public static void main(String[] args) { 5 Course course = new Course("Java设计模式精讲"); 6 Teacher teacher1 = new Teacher("Alpha"); 7 Teacher teacher2 = new Teacher("Beta"); 8 course.addObserver(teacher1); 9 course.addObserver(teacher2); 10 //业务逻辑代码 11 Question question = new Question(); 12 question.setUserName("Geely"); 13 question.setQuestionContent("Java的主函数如何编写"); 14 course.produceQuestion(course,question); 15 } 16 }
1 package com.geely.design.pattern.behavioral.observer.guavatest; 2 3 import com.google.common.eventbus.Subscribe; 4 5 public class GuavaEvent { 6 @Subscribe 7 public void subscribe(String str){ 8 System.out.println("执行subscribe方法,传入的参数是:" + str); 9 } 10 }
1 package com.geely.design.pattern.behavioral.observer.guavatest; 2 3 import com.google.common.eventbus.EventBus; 4 5 public class GuavaEventTest { 6 public static void main(String[] args) { 7 EventBus eventBus = new EventBus(); 8 GuavaEvent guavaEvent = new GuavaEvent(); 9 eventBus.register(guavaEvent); 10 eventBus.post("post的内容"); 11 } 12 }

浙公网安备 33010602011771号