设计模式课程 设计模式精讲 21-2 观察者模式coding

限于喜欢 提交于 2020-02-17 09:21:21

1    代码演练

1.1  代码演练1(一对一观察)

1.2  代码演练2(一对多观察)

1.3  代码演练3(多对多观察)

 

 

 

1    代码演练

1.1  代码演练1(一对一观察)

需求:

木木网课程系统,教师后台提醒功能,当对应课程收到提问时,系统能给对应教师发出提醒

 

注意:

a  设计的时候,可以分为教师类,课程类和问题类。课程类作为被观察者,教师类作为观察者,问题类作为被观察者的一个参数。

b  根据系统已经有jdk提供的两个类 Observable(作为被观察者要继承的类)和 Observer(作为被观察者实现要实现的类)。我们能够轻松实现功能。

 

uml类图:

 

 

 

 

 

测试类:

package com.geely.design.pattern.behavioral.observer;

public class Test {
    public static void main(String [] args){
        Teacher teacher = new Teacher("李大霄");
        Course course = new Course();
        course.setCourseName("基金定投");

        //基金定投课程添加添加观察者 李大霄老师
        course.addObserver(teacher);

        Question question = new Question();
        question.setUserName("乐于助人的丽娜");
        question.setQuestionContent("老师您好,什么时候才能止盈啊?");

        course.produceQuestion(course,question);
    }
}

 

教师类:

package com.geely.design.pattern.behavioral.observer;

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

public class Teacher implements Observer {
    private String teacherName;

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

    public String getTeacherName() {
        return teacherName;
    }

    /**
     * 被观察者为 Observable o,被观察者参数为 Object arg
     * @param o
     * @param arg
     */
    @Override
    public void update(Observable o, Object arg) {
        Course course = (Course) o;//之所以能这样调,是因为Course 继承了 Observable
        Question question = (Question) arg;
        System.out.println(teacherName+"老师的"+course.getCourseName()+"课程中收到一条关于"+question.getQuestionContent()+"的问题,该问题的提出者为"+question.getUserName());
    }
}

 

课程类:

package com.geely.design.pattern.behavioral.observer;

import java.util.Observable;

public class Course extends Observable {
    private String courseName;

    public String getCourseName() {
        return courseName;
    }

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

    public void produceQuestion(Course course,Question question){
        System.out.println(course.getCourseName()+"课程中收到一条问题,该问题内容为"+question.getQuestionContent());

        //以下两行添加后可以通知观察者,调观察者的update方法
        setChanged();
        notifyObservers(question);
    }
}

 

问题类:

package com.geely.design.pattern.behavioral.observer;

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;
    }
}

 

打印日志:

基金定投课程中收到一条问题,该问题内容为老师您好,什么时候才能止盈啊?
李大霄老师的基金定投课程中收到一条关于老师您好,什么时候才能止盈啊?的问题,该问题的提出者为乐于助人的丽娜

Process finished with exit code 0

 

 

1.2  代码演练2(一对多观察)

测试类:

package com.geely.design.pattern.behavioral.observer;

public class Test {
    /*public static void main(String [] args){
        Teacher teacher = new Teacher("李大霄");
        Course course = new Course();
        course.setCourseName("基金定投");

        //基金定投课程添加添加观察者 李大霄老师
        course.addObserver(teacher);

        Question question = new Question();
        question.setUserName("乐于助人的丽娜");
        question.setQuestionContent("老师您好,什么时候才能止盈啊?");

        course.produceQuestion(course,question);
    }*/


    public static void main(String [] args){
        Teacher teacher = new Teacher("李大霄");
        Teacher teacher2 = new Teacher("肖志刚");
        Course course = new Course();
        course.setCourseName("基金定投");

        //基金定投课程添加添加观察者 李大霄老师
        course.addObserver(teacher);
        course.addObserver(teacher2);

        Question question = new Question();
        question.setUserName("乐于助人的丽娜");
        question.setQuestionContent("老师您好,什么时候才能止盈啊?");

        course.produceQuestion(course,question);
    }
}

 

打印日志:

基金定投课程中收到一条问题,该问题内容为老师您好,什么时候才能止盈啊?
肖志刚老师的基金定投课程中收到一条关于老师您好,什么时候才能止盈啊?的问题,该问题的提出者为乐于助人的丽娜
李大霄老师的基金定投课程中收到一条关于老师您好,什么时候才能止盈啊?的问题,该问题的提出者为乐于助人的丽娜

Process finished with exit code 0

 

1.3  代码演练3(多对多观察)

测试类:

package com.geely.design.pattern.behavioral.observer;

public class Test {
    /*public static void main(String [] args){
        Teacher teacher = new Teacher("李大霄");
        Course course = new Course();
        course.setCourseName("基金定投");

        //基金定投课程添加添加观察者 李大霄老师
        course.addObserver(teacher);

        Question question = new Question();
        question.setUserName("乐于助人的丽娜");
        question.setQuestionContent("老师您好,什么时候才能止盈啊?");

        course.produceQuestion(course,question);
    }*/


    /*public static void main(String [] args){
        Teacher teacher = new Teacher("李大霄");
        Teacher teacher2 = new Teacher("肖志刚");
        Course course = new Course();
        course.setCourseName("基金定投");

        //基金定投课程添加添加观察者 李大霄老师
        course.addObserver(teacher);
        course.addObserver(teacher2);

        Question question = new Question();
        question.setUserName("乐于助人的丽娜");
        question.setQuestionContent("老师您好,什么时候才能止盈啊?");

        course.produceQuestion(course,question);
    }*/


    public static void main(String [] args){
        Teacher teacher = new Teacher("李大霄");
        Teacher teacher2 = new Teacher("肖志刚");
        Course course = new Course();
        course.setCourseName("基金定投");
        Course course2 = new Course();
        course2.setCourseName("基金加减仓策略");

        //基金定投课程添加添加观察者 李大霄老师
        course.addObserver(teacher);
        course2.addObserver(teacher2);

        Question question = new Question();
        question.setUserName("乐于助人的丽娜");
        question.setQuestionContent("老师您好,什么时候才能止盈啊?");

        Question question2 = new Question();
        question2.setUserName("加加减减");
        question2.setQuestionContent("老师您好,踏空了怎么办?");

        course.produceQuestion(course,question);
        course2.produceQuestion(course2,question2);
    }
}

 

 

 

打印日志:

基金定投课程中收到一条问题,该问题内容为老师您好,什么时候才能止盈啊?李大霄老师的基金定投课程中收到一条关于老师您好,什么时候才能止盈啊?的问题,该问题的提出者为乐于助人的丽娜基金加减仓策略课程中收到一条问题,该问题内容为老师您好,踏空了怎么办?肖志刚老师的基金加减仓策略课程中收到一条关于老师您好,踏空了怎么办?的问题,该问题的提出者为加加减减Process finished with exit code 0



 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!