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

设计模式课程 设计模式精讲 21-2 观察者模式coding的更多相关文章

  1. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  2. 设计模式课程 设计模式精讲 17-2 模板方法模式coding

    1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...

  3. 设计模式课程 设计模式精讲 6-2 抽象工厂coding

    1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...

  4. 设计模式课程 设计模式精讲 18-2 迭代器模式coding

    1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...

  5. 设计模式课程 设计模式精讲 5-2 工厂方法coding

    1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...

  6. 设计模式课程 设计模式精讲 22-2 备忘录模式coding

    1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 网站笔记需要存储快照,能实现回退的功能. 注意: a 设计的时候,可以分为笔记类,笔记快照类和 笔记快照管理类  三个类. ...

  7. 设计模式课程 设计模式精讲 2-3 UML类图讲解自上而下

    1 内容简析(易错加粗) 2 uml类图展示 1 内容简析(易错加粗) 1.1 设计模式中的对象关系 依赖关系 虚线箭头 组合关系 实心菱形 聚合关系 空心菱形(想象成盘子,盛东西,盘子的多,另一方少 ...

  8. 设计模式课程 设计模式精讲 3-10 里氏替换原则coding

    1 代码演练 1.1 继承关系判别(是否是真正意义的继承) 1.2 入参控制 1.3 出参控制 1 代码演练 1.1 继承关系判别(是否是真正意义的继承)(其实我觉得这个例子有点牵强) 1.1.1 反 ...

  9. 设计模式课程 设计模式精讲 3-8 迪米法特原则讲解及Coding

    1 课程讲解 1.1 定义 1.2 特质 1.3 重点 2 代码演练 2.1 反例 2.2 正例 1 课程讲解 1.1 定义 定义:一个对象应该对其他对象保持最少的了解.又叫最少知道原则. 1.2 特 ...

随机推荐

  1. ant+jmeter 自动生成测试报告

    1,把Jmeter根目录/extras 下的ant-jmeter-xxx.jar拷贝到ant根目录/lib下 2, 修改Jmeter的bin目录下jmeter.properties文件的配置:jmet ...

  2. 入门chrome插件开发教程和经验总结,一篇就搞掂!

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_44244857/articl ...

  3. tkinter学习(5)messagebox、pack、grid和place方法

    1.messagebox信息弹出框 1.1 代码: import tkinter as tk #导出tk模块 import tkinter.messagebox #导出弹出信息框 #定义窗口.标题.大 ...

  4. Java 线程高级

    1.volatile关键字:当多个线程操作共享数据时,可以保证内存中的数据可见,相较于syncronized是一种较为轻量级的同步策略, 注意:1.volatile不具有“互斥性” 2.volatil ...

  5. Scrapy 命令

    Scrapy提供了两种类型的命令.一种必须在Scrapy项目中运行(针对项目(Project-specific)的命令),另外一种则不需要(全局命令).全局命令在项目中运行时的表现可能会与在非项目中运 ...

  6. Zabbix监控工具介绍及软件监控、硬件监控及报警练习

     zabbix介绍 zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供 ...

  7. MySQL8.0.11安装后,使用CMD无法启动mysql服务

    首先,先把mysql的bin路径添加到系统环境变量 这样做可以,直接进入CMD后执行mysql服务,不需要进入mysql的bin文件路径去执行. 第一步:在MySQL的安装文件的bin目录(例如:C: ...

  8. webpack 中使用 autoprefixer

    webpack中autoprefixer是配合postcss-loader使用的,首先安装相应资源: npm i -D style-loader css-loader postcss-loader a ...

  9. Python3.5学习之旅——day6

    面向对象编程的学习 一.定义 首先跟大家介绍一位资深的程序员前辈说过的编程心得: 1.写重复代码是非常不好且低级的行为 2.完成的代码需要经常变更 所以根据以上两个心得,我们可以知道写的代码一定要遵循 ...

  10. pytest+allure(allure-pytest基于这个插件)设计定制化报告

    一:环境准备 1.python3.6 2.windows环境 3.pycharm 4.allure-pytest 5.allure2.8.0 6.java1.8 allure-pytest快速安装 在 ...