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. turtle库常用命令

    一, 海龟动作: 移动和绘制 forward()| fd() 前进多少 backward()|bk()|back()后退 right()|rt() 右转多少度 left() 左转多少度 goto()| ...

  2. Laravel Vuejs 实战:开发知乎 (2)用户登录

    1.安装一个给用户提示的扩展包: 二选一: https://github.com/laracasts/flash [我选的这个]https://github.com/oanhnn/laravel-fl ...

  3. div 悬浮

    一个小需求,鼠标移动一个产品那, 显示这个产品的具体信息 代码如下: <a href="javascript:void(0);" onclick="frameSea ...

  4. JS-try/catch方法判断字符串是否为json格式

    定义: try/catch 语句用于处理代码中可能出现的错误信息,出现异常会导致程序崩溃,而try/catch 则可以保证程序的正常运行. try { //执行代码 不报错则 正常执行 不会进入下面的 ...

  5. Sudo临时提权配置

    目录 Sudo临时提权配置 参考 Sudo简介 Sudo配置文件 Sudo配置语法 Sudo配置实例 Sudo日志记录 Sudo临时提权配置

  6. December 28th, Week 52nd Saturday, 2019

    If you start at the bottom, pay your dues, life here can be a dream come true. 只要你从头开始,脚踏实地,梦想是可以成真的 ...

  7. 学好Linux必备知识

    鸟哥的私房菜中提到学好Linux必备的几种技能: 1.  计算器概论不硬件相关知识: 因为既然想要走Linux这门路,信息相关癿基础技能也丌能没有啊! 所以先理觋一下基础癿硬件知识,丌用一定要全懂啦! ...

  8. 《掌握融资必备知识》---创业学习---训练营第一课---HHR---

    一,<开始学习> 1,四个思考题: (1)从你决定开始融资,到你拿到钱,你都需要经历哪些环节? (2)你知道投资机构内部的工作流程吗? (3)融资最好的时机是什么时候? (4)创投圈的专业 ...

  9. HYSBZ-2038小Z的袜子

    作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从 ...

  10. jQuery结合CSS实现手风琴组件(2)----利用seajs实现静态资源模块化引入

    1. 目录结构(webStrom) 2. 代码 1.html <!DOCTYPE html> <html lang="en"> <head> & ...