设计模式07--观察者模式

目录

 

1.观察者模式

 2. UML类图


1.观察者模式

    定义:

  

    使用场景:

    

    优点:

     

     缺点:

     

   现在的业务场景是这样的:一个学生在线上学完课程后给课程的老师提了一个问题,那么老师需要接收到那个学生就哪个课程提了什么问题。观察者肯定就是老师,被观察者是课程,而不是问题。

 2. UML类图

编写一个观察者,老师是观察者,被观察者的状态发生改变以后需要通知观察者。update()方法就是被观察者改变状态后,观察者执行的方法,这个方法还可以接收被观察者传过来的参数。

package com.wx.design_pattern.observer;


import java.util.Observable;
import java.util.Observer;

/**
 * User: Mr.Wang
 * Date: 2019/12/19
 */
public class TeacherObserver implements Observer {

    private String name;

    public TeacherObserver(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        CourseObservable courseObservable = (CourseObservable) o;
        Question question = (Question) arg;
        System.out.println(name + "的课程:" + courseObservable.getCourseName()
                + "收到" + question.getUsreName() + "提出的问题:" + question.getQuestName());
    }
}

 课程作为被观察者,他需要做的事情就是改变状态,通知所有的观察者。

package com.wx.design_pattern.observer;

import java.util.Observable;

/**
 * User: Mr.Wang
 * Date: 2019/12/19
 */
public class CourseObservable extends Observable {
    private String courseName;

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

    /***
     * 问题提出以后被观察者状态就要发生改变,并且通知所有的观察者对象
     * 并且具体要通知什么消息,可以传也可以不传
     * @param question
     * @param course
     */
    public void productQuestion(Question question, CourseObservable course) {
        System.out.println(question.getUsreName() + "在" + course.getCourseName()
                + "提了一个问题:" + question.getQuestName());
        setChanged();
        notifyObservers(question);
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
}

 一个课程的实体EventPayload

package com.wx.design_pattern.observer;

/**
 * User: Mr.Wang
 * Date: 2019/12/19
 */
public class Question {
    private String questName;

    private String usreName;

    public String getUsreName() {
        return usreName;
    }

    public void setUsreName(String usreName) {
        this.usreName = usreName;
    }

    public String getQuestName() {
        return questName;
    }

    public void setQuestName(String questName) {
        this.questName = questName;
    }
}

客户端测试:

package com.wx.design_pattern.observer;

/**
 * User: Mr.Wang
 * Date: 2019/12/19
 */
public class Test1 {
    public static void main(String[] args) {
        CourseObservable courseObservable = new CourseObservable("权限管理");
        TeacherObserver teacherWang = new TeacherObserver("Mr.Wang");
        TeacherObserver teacherWu = new TeacherObserver("Mr.Wu");
        courseObservable.addObserver(teacherWang);
        courseObservable.addObserver(teacherWu);

        //业务逻辑:学生提出问题 老师收到
        Question question = new Question();
        question.setQuestName("怎么解决循环依赖的问题");
        question.setUsreName("小明");
        courseObservable.productQuestion(question, courseObservable);

    }
}

 效果:

观察者模式的通用类图:

   

发布了217 篇原创文章 · 获赞 70 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/103606645