分析:在本实例中,学校的“铃”是事件源和目标,“老师”和“学生”是事件监听器和具体观察者,“铃声”是事件类。学生和老师来到学校的教学区,都会注意学校的铃,这叫事件绑定;当上课时间或下课时间到,会触发铃发声,这时会生成“铃声”事件;学生和老师听到铃声会开始上课或下课,这叫事件处理。这个实例非常适合用观察者模式实现,图 3 给出了学校铃声的事件模型。

图3 学校铃声的事件模型图

现在用“观察者模式”来实现该事件处理模型。

首先,定义一个铃声事件(RingEvent)类,它记录了铃声的类型(上课铃声/下课铃声)。

再定义一个学校的铃(BellEventSource)类,它是事件源,是观察者目标类,该类里面包含了监听器容器 listener,可以绑定监听者(学生或老师),并且有产生铃声事件和通知所有监听者的方法。

然后,定义铃声事件监听者(BellEventListener)类,它是抽象观察者,它包含了铃声事件处理方法 heardBell(RingEvent e)。

最后,定义老师类(TeachEventListener)和学生类(StuEventListener),它们是事件监听器,是具体观察者,听到铃声会去上课或下课。图 4 给出了学校铃声事件处理程序的结构。

图4 学校铃声事件处理程序的结构图


import java.util.*;public class BellEventTest {public static void main(String[] args) {BellEventSource bell = new BellEventSource();    //铃(事件源)bell.addPersonListener(new TeachEventListener()); //注册监听器(老师)bell.addPersonListener(new StuEventListener());    //注册监听器(学生)bell.ring(true);   //打上课铃声System.out.println("------------");bell.ring(false);  //打下课铃声}
}//铃声事件类:用于封装事件源及一些与事件相关的参数
class RingEvent extends EventObject {private static final long serialVersionUID = 1L;private boolean sound;    //true表示上课铃声,false表示下课铃声public RingEvent(Object source, boolean sound) {super(source);this.sound = sound;}public void setSound(boolean sound) {this.sound = sound;}public boolean getSound() {return this.sound;}
}//目标类:事件源,铃
class BellEventSource {private List<BellEventListener> listener; //监听器容器public BellEventSource() {listener = new ArrayList<BellEventListener>();}//给事件源绑定监听器public void addPersonListener(BellEventListener ren) {listener.add(ren);}//事件触发器:敲钟,当铃声sound的值发生变化时,触发事件。public void ring(boolean sound) {String type = sound ? "上课铃" : "下课铃";System.out.println(type + "响!");RingEvent event = new RingEvent(this, sound);notifies(event);    //通知注册在该事件源上的所有监听器}//当事件发生时,通知绑定在该事件源上的所有监听器做出反应(调用事件处理方法)protected void notifies(RingEvent e) {BellEventListener ren = null;Iterator<BellEventListener> iterator = listener.iterator();while (iterator.hasNext()) {ren = iterator.next();ren.heardBell(e);}}
}//抽象观察者类:铃声事件监听器
interface BellEventListener extends EventListener {//事件处理方法,听到铃声public void heardBell(RingEvent e);
}//具体观察者类:老师事件监听器
class TeachEventListener implements BellEventListener {public void heardBell(RingEvent e) {if (e.getSound()) {System.out.println("老师上课了...");} else {System.out.println("老师下课了...");}}
}//具体观察者类:学生事件监听器
class StuEventListener implements BellEventListener {public void heardBell(RingEvent e) {if (e.getSound()) {System.out.println("同学们,上课了...");} else {System.out.println("同学们,下课了...");}}
}

程序运行结果如下:

上课铃响!
老师上课了...
同学们,上课了...
------------
下课铃响!
老师下课了...
同学们,下课了...

利用观察者模式设计一个学校铃声的事件处理程序相关推荐

  1. python-GUI:利用pyqt5设计一个bootloader上位机页面(ZLG驱动)及打包报错faild to execute script pyi_rth_multiprocessing精简方案

    python-GUI:利用pyqt5设计一个bootloader上位机页面 1.下载pyqt5和Qt Designer 2.利用Qt Designer设计页面 步骤一:打开Qt Designer 步骤 ...

  2. java完成一个学生信息调查程序_利用Java设计一个简单的学生信息管理程序

    利用Java设计一个简单的控制台学生信息管理程序 此程序可作为课设的参考,其中信息存储于文件中. 创建了学生类Student,用于存储学号等的信息.创建StudentFunction类,用于实现诸如学 ...

  3. 设计一个学校在册人员类(Person)。数据成员包括身份证号(IdPerson)、姓名(Name)、性别(Sex)、生日(Birth-day)和家庭住址(HomeAddress)。成员函数包括人员信息

    在1设计一个学校在册人员类(Person).数据成员包括身份证号(IdPerson).姓名(Name).性别(Sex).生日(Birth-day)和家庭住址(HomeAddress).成员函数包括人员 ...

  4. 数字逻辑练习题(十一)利用74LS161设计一个七进制计数器

    一.题目描述 已知74LS161为同步四位二进制加法计数器,其逻辑符号和功能表如下,请利用74LS161设计一个七进制计数器.应写出分析设计过程. 二.问题解答 (1)分析 采用同步置数法进行设计:

  5. 在matlab中实现累乘,如何利用matlab设计一个线性相位FIR带通滤波器,并在FPGA上实现...

    设计要求 利用matlab设计一个线性相位FIR带通滤波器,并在FPGA上实现. 1.滤波器指标:过渡带带宽分别为100~300HZ,500~700HZ,阻带允许误差为0.02,通带允许误差为0.01 ...

  6. 利用 74390 设计一个模 6 计数器,要求从 000 计数至 101,利用D触发器使其暂态的高电平清零信号延长而稳定

    下面的图有错:请将inst3(非门)删去,图74390与ddf都是上升沿触发 任务 1:利用 74390 设计一个模 6 计数器,要求从 000 计数至 101,请用 Run Functional S ...

  7. 如何利用 AVFoundation 设计一个通用稳定的音视频框架?

    前言 承接上篇的<AV Foundation开发秘籍--实践掌握iOS & OS X应用的视听处理技术 阅读指南> 今天这篇给大家讲解下如何利用AVFoundation设计一套通用 ...

  8. 利用epoll写一个迷你的网络事件库

    epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取 ...

  9. 设计一个学校食堂管理系统

    题目内容:学校食堂管理系统,包含食堂表,食堂仓口表,仓口收费记录表 题目解析: – 一个食堂有多个仓口卖饭,关系为1:m, –每个仓口卖饭可以有很多次,仓口与收费记录也是1:m 实现: drop da ...

最新文章

  1. 观察者模式的经典应用(猫叫 烧开水)
  2. 我的第一个纯手写jQuery插件
  3. 真正完美攻略之星月夜~Seven Tales in Spiral(中国同人文字AVG)
  4. 小而美的个人博客——前端——about
  5. 图论(六)图的两种表示方法
  6. oracle电梯案例,Oracle技术嘉年华的一个案例,redo的那些事,连载一
  7. NLP之路-Deep Learning in NLP (一)词向量和语言模型
  8. 最近30分钟合约市场爆仓702万美元 BTC爆仓281万美元
  9. java应用uploadify 3.2丢失session
  10. iOS【面试】2018年面试题集锦
  11. Autocad中批量调整增强属性块中的元素的位置
  12. jxl生成excel 设置隐藏列 隐藏行
  13. .NET Serviece安装及 启动报错(The Parameter is Incorrect)参数错误问题处理
  14. portSentry入侵检测工具
  15. linux下使用打印机
  16. 方案详解|AARRR+八角行为分析=用游戏化思维实现用户增长
  17. 微信个人号机器人接口
  18. 论文阅读笔记——[MPN]: Multi-task Learning with Coarse Priors for Robust Part-aware Person Re-identification
  19. Java顺序与选择结构实验问题,初中物理说课稿模板2
  20. 移动开发者服务平台Mob应邀亮相广东互联网大会

热门文章

  1. Arduino + RS485测温装置
  2. Android全球开发者大会参后感
  3. Java如何正确关闭IO流
  4. VBA病毒“制造机”正在流行
  5. 一张图读懂神州数码集团2020全年业绩
  6. 23种设计模式之工厂方法模式(黑马程序员)
  7. golang开发环境配置以及简单使用
  8. Vedio.js视频播放
  9. 数据分箱(分层)的几种方法
  10. 嵌入式Linux系统开发笔记(二)