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



 

posted on 2020-02-17 08:56  菜鸟乙  阅读(150)  评论(0编辑  收藏  举报