观察者模式

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 }

 

posted @ 2019-01-06 17:32  逢春  阅读(177)  评论(1)    收藏  举报