2.8 观察者模式

文章介绍了观察者模式的概念,它定义了一对多的依赖关系,当被观察的对象状态改变时,所有依赖于它的对象都会得到通知。文中通过一个课程和教师的例子展示了如何使用观察者模式,当学生在课程中提问时,教师会自动收到通知。
摘要由CSDN通过智能技术生成

1.定义
定义了对象之间一对多的依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。举个例子,我在微信朋友圈的某一条动态点赞,那么我就是观察者,动态就是被观察者,当我的好友也评论了该条动态时,微信就会将消息同步给我,而不需要我时刻盯着动态看是否有人评论。

2.优点
观察者和被观察者之间建立一个抽象的耦合,观察者模式支持广播通信。

3.代码示例

public class Course extends Observable {
    private String courseName;

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

    public String getCourseName() {
        return courseName;
    }

	/**
     *
     * @param course 被观察者
     * @param question 观察事件
     */
    public void produceQuestion(Course course, Question question) {
        System.out.println(question.getUserName() + "同学在" + course.courseName + "课程,提了一个问题:" + question.getQuestionContent());
        setChanged();
        notifyObservers(question);
    }
}
public class Teacher implements Observer {
    private String teacherName;

    public Teacher(String teacherName) {
        this.teacherName = teacherName;
    }

    public String getTeacherName() {
        return teacherName;
    }

	/**
     *
     * @param o 被观察者
     * @param arg 观察事件
     */
    @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.getQuestionContent());
    }
}
public class Question {
    //提问者用户名
    private String userName;

    //问题内容
    private String questionContent;
    
    public Question(String userName, String questionContent) {
        this.userName = userName;
        this.questionContent = questionContent;
    }

    public String getUserName() {
        return userName;
    }

    public String getQuestionContent() {
        return questionContent;
    }
}
public class Test {
    public static void main(String[] args) {
        Course course = new Course("Java");
        Teacher teacher = new Teacher("Steven");
        Question question = new Question("Sherry", "重载和重写的区别是啥?");
        course.produceQuestion(course, question);
        teacher.update(course, question);
    }
}
Sherry同学在Java课程,提了一个问题:重载和重写的区别是啥?
Steven老师在Java课程,接收到Sherry同学提出的一个问题:重载和重写的区别是啥?

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值