zoukankan      html  css  js  c++  java
  • 观察者模式

    一、定义

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

    举例:

    1、你点赞了微信中的某条信息。 你就是观察者, 这条信息就是主题对象(被观察者),当这条消息被评论的时候,微信就会通知你,不需要时刻关注。

    2、京东上关注的商品的降价提醒。

    二、适用场景

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

    三、观察者模式-优点

    1、观察者和被观察者之间建立了一个抽象的耦合。因为是抽象耦合,增加观察者或者增加被观察者,都非常容易扩展

    2、观察者模式支持广播通信

    四、缺点

    1、观察者之间有过多的细节依赖,提高时间消耗和程序复杂度

    2、使用要得当,要避免循环调用

    五、Coding

    学生提了某个课程的一个问题,老师接收到了这个课程提的问题。

    1、创建问题类

    public class Question {
    
        private String userName;
        private String questionContent;
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getQuestionContent() {
            return questionContent;
        }
    
        public void setQuestionContent(String questionContent) {
            this.questionContent = questionContent;
        }
    }
    

      

    2、创建Course

    /**
     * 被观察者
     */
    public class Course  extends Observable {
        private String courseName;
    
        public String getCourseName() {
            return courseName;
        }
    
        public void setCourseName(String courseName) {
            this.courseName = courseName;
        }
    
        public Course(String courseName) {
            this.courseName = courseName;
        }
    
        public  void produceQuestion(Course course, Question question){
            System.out.println(question.getUserName() +"在" + course.courseName + "提交了一个问题");
            setChanged();
            notifyObservers(question);
        }
    }
    

      

    3、创建教师类

    /**
     * 观察者
     */
    public class Teacher implements Observer{
        private String teacherName;
    
        public String getTeacherName() {
            return teacherName;
        }
    
        public void setTeacherName(String teacherName) {
            this.teacherName = teacherName;
        }
    
        public Teacher(String teacherName) {
            this.teacherName = teacherName;
        }
    
        //并发过高的解决方法: 1、异步  2、消息队列
        @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());
        }
    }
    

       update方法并发过高的解决方法: 1、异步  2、消息队列

      

    4、测试

    public class Test {
        public static void main(String[] args) {
            Course course = new Course("Java设计模式");
            Teacher teacher = new Teacher("张三");
            course.addObserver(teacher);
    
            //业务逻辑代码
            Question question = new Question();
            question.setUserName("小明");
            question.setQuestionContent("单例模式的优点?");
    
            course.produceQuestion(course, question);
        }
    }
    

      

    5、结果

    6、UML图

    7、如果测试类有两个老师,如

    public class Test {
        public static void main(String[] args) {
            Course course = new Course("Java设计模式");
            Teacher teacher = new Teacher("张三");
            Teacher teacher2 = new Teacher("李四");
            course.addObserver(teacher);
            course.addObserver(teacher2);
    
            //业务逻辑代码
            Question question = new Question();
            question.setUserName("小明");
            question.setQuestionContent("单例模式的优点?");
    
            course.produceQuestion(course, question);
        }
    }
    

      那个,两个老师都会收到消息

    六、在源码中的使用

    1、Event类 awt事件监听器

    2、Spring中的监听器

      <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
      </listener>
    

      实现了ServletRequestListener接口

     EventListeener就是监听器

     EventListeener的实现

    监听器的实现方案是观察者模式实现的一种,另外也称之为发布-订阅模式。

    3、Android中的OnclickListener

  • 相关阅读:
    jMeter 里 CSV Data Set Config Sharing Mode 的含义详解
    如何使用 jMeter Parallel Controller
    使用 Chrome 开发者工具 coverage 功能分析 web 应用的渲染阻止资源的执行分布情况
    使用 Chrome 开发者工具的 lighthouse 功能分析 web 应用的性能问题
    关于 SAP 电商云首页加载时触发的 OCC API 请求
    SAP UI5 确保控件 id 全局唯一的实现方法
    SAP 电商云 Accelerator 和 Spartacus UI 的工作机制差异
    介绍一个好用的能让网页变成黑色背景的护眼 Chrome 扩展应用
    Chrome 开发者工具 performance 标签页的用法
    Client Side Cache 和 Server Side Cache 的区别
  • 原文地址:https://www.cnblogs.com/linlf03/p/10453856.html
Copyright © 2011-2022 走看看