基础与定义
- 定义来对象之间的一对多依赖,让多个观察者对象同时监听某一个主题,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新
 
比如:淘宝你关注来一个商品的降价提醒,它降价来就会通知你
JDK对此模式的支持
- Observable 被观察对象继承它
 
源码实例
- listener
 - java.awt 或 java.swing 里面的 event
 
代码实例
学生给老师的课程提问题,老师是观察这,课程是被观察者
// 实现 Observable
public class Course extends Observable {
    private String courseName;
    public Course(String courseName) {
        this.courseName = courseName;
    }
    public String getCourseName() {
        return courseName;
    }
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
    public void produceQuestion(Course course,Question question){
        System.out.println(question.getUserName()+"" +
                "在"+course.getCourseName()+"提出问题");
        setChanged();
        // 传入参数
        notifyObservers(question);
    }
}
// 问题
@Data
public class Question {
    private String userName;
    private String wenti;
}
// 教师类 实现 Oberver
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.getUserName()+"提交的问题:"+question.getWenti());
    }
}
// 使用
public class Test {
    public static void main(String[] args){
        Course course =
                new Course("JAVA 设计模式精讲");
        Teacher teacher = new Teacher("王二娃");
        Teacher teacher1 = new Teacher("王大娃");
        course.addObserver(teacher);
        course.addObserver(teacher1);
        // 业务逻辑代码
        Question question = new Question();
        question.setUserName("二狗子");
        question.setWenti("1 +  1 = ?");
        course.produceQuestion(course,question);
    }
}