zoukankan      html  css  js  c++  java
  • 设计模式课程 设计模式精讲 21-2 观察者模式coding

    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



  • 相关阅读:
    多线程中变量的内存分配
    VS2019解决Cannot resolve symbol ' '问题
    排序算法——选择排序
    观察者模式
    c# 之linq——小白入门级
    c# 迭代器
    MySql学习
    rabbitmq安装及简单demo练习
    VMware Workstation 12 PRo密钥
    远程过程调用——RPC
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/12320285.html
Copyright © 2011-2022 走看看