2

观察者模式

1.定义与类型

  • 定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖着都会收到通知并更新。
  • 类型:行为型

2.适用场景

  • 关联行为场景,建立一套触发机制

3.优点

  • 观察者和被观察者之间建立一个抽象的耦合
  • 观察者模式支持广播通信

4.缺点

  • 观察者之间有过多的细节依赖,提高时间消耗及程序复杂度
  • 使用要得当,避免循环调用

5.Coding

  • 创建问题类
public class Teacher implements Observer {
    private String  teacherName;
    public Teacher(String teacherName){
        this.teacherName = teacherName;
    }

    @Override
    public void update(Observable o, Object arg) {
        Course course = (Course) o;
        Question question = (Question) arg;
        System.out.println(teacherName+"老师的"+course.getCourseName()+",收到一个来自"+question.getStudentName()+"提出的问题:"+question.getQuestionContent());
    }
}
  • 创建课程类

    • 继承Observable类,表示是一个被观察者

image-20211017102445481

  • 可以重写其中的方法,setChange()标识告诉观察者有改变;notifyObservers()通知观察者
public class Course extends Observable {

    private String courseName;

    public Course(String courseName) {
        this.courseName = courseName;
    }

    public String getCourseName() {
        return courseName;
    }
    public void produceQuestion(Course course,Question question){
        System.out.println(question.getStudentName()+"在"+course.getCourseName()+"课程中,提出了问题:"+question.getQuestionContent());
        setChanged();
        notifyObservers(question);
    }
}
  • 创建教师类

    • 实现Observer接口,表示是一个观察者
    • 重写update方法,可以根据被观察者传递的参数进行业务逻辑编写
public class Teacher implements Observer {
    private String  teacherName;
    public Teacher(String teacherName){
        this.teacherName = teacherName;
    }

    @Override
    public void update(Observable o, Object arg) {
        Course course = (Course) o;
        Question question = (Question) arg;
        System.out.println(teacherName+"老师的"+course.getCourseName()+",收到一个来自"+question.getStudentName()+"提出的问题:"+question.getQuestionContent());
    }
}
  • Test类
public class Test {
    public static void main(String[] args) {
        // 创建被观察者
        Course course = new Course("如何让富婆爱上我~");
        // 创建观察者
        Teacher teacher = new Teacher("HHHH");
        // 绑定观察者和被观察者
        course.addObserver(teacher);
        
        Question question = new Question();
        question.setStudentName("Root");
        question.setQuestionContent("有富婆的联系方式  吗?");
        
        course.produceQuestion(course,question);

    }
}
  • 控制台输出

image-20211017102755507

6.总结

  • 两个结构:观察者和被观察者
  • 被观察者发生改变时,可以通知观察者
  • 观察者可以接受被观察者发生改变传入的参数,进行编码

Root
4 声望4 粉丝