利用观察者模式设计一个学校铃声的事件处理程序
分析:在本实例中,学校的“铃”是事件源和目标,“老师”和“学生”是事件监听器和具体观察者,“铃声”是事件类。学生和老师来到学校的教学区,都会注意学校的铃,这叫事件绑定;当上课时间或下课时间到,会触发铃发声,这时会生成“铃声”事件;学生和老师听到铃声会开始上课或下课,这叫事件处理。这个实例非常适合用观察者模式实现,图 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("同学们,下课了...");}}
}
程序运行结果如下:
上课铃响! 老师上课了... 同学们,上课了... ------------ 下课铃响! 老师下课了... 同学们,下课了...
利用观察者模式设计一个学校铃声的事件处理程序相关推荐
- 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 步骤 ...
- java完成一个学生信息调查程序_利用Java设计一个简单的学生信息管理程序
利用Java设计一个简单的控制台学生信息管理程序 此程序可作为课设的参考,其中信息存储于文件中. 创建了学生类Student,用于存储学号等的信息.创建StudentFunction类,用于实现诸如学 ...
- 设计一个学校在册人员类(Person)。数据成员包括身份证号(IdPerson)、姓名(Name)、性别(Sex)、生日(Birth-day)和家庭住址(HomeAddress)。成员函数包括人员信息
在1设计一个学校在册人员类(Person).数据成员包括身份证号(IdPerson).姓名(Name).性别(Sex).生日(Birth-day)和家庭住址(HomeAddress).成员函数包括人员 ...
- 数字逻辑练习题(十一)利用74LS161设计一个七进制计数器
一.题目描述 已知74LS161为同步四位二进制加法计数器,其逻辑符号和功能表如下,请利用74LS161设计一个七进制计数器.应写出分析设计过程. 二.问题解答 (1)分析 采用同步置数法进行设计:
- 在matlab中实现累乘,如何利用matlab设计一个线性相位FIR带通滤波器,并在FPGA上实现...
设计要求 利用matlab设计一个线性相位FIR带通滤波器,并在FPGA上实现. 1.滤波器指标:过渡带带宽分别为100~300HZ,500~700HZ,阻带允许误差为0.02,通带允许误差为0.01 ...
- 利用 74390 设计一个模 6 计数器,要求从 000 计数至 101,利用D触发器使其暂态的高电平清零信号延长而稳定
下面的图有错:请将inst3(非门)删去,图74390与ddf都是上升沿触发 任务 1:利用 74390 设计一个模 6 计数器,要求从 000 计数至 101,请用 Run Functional S ...
- 如何利用 AVFoundation 设计一个通用稳定的音视频框架?
前言 承接上篇的<AV Foundation开发秘籍--实践掌握iOS & OS X应用的视听处理技术 阅读指南> 今天这篇给大家讲解下如何利用AVFoundation设计一套通用 ...
- 利用epoll写一个迷你的网络事件库
epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取 ...
- 设计一个学校食堂管理系统
题目内容:学校食堂管理系统,包含食堂表,食堂仓口表,仓口收费记录表 题目解析: – 一个食堂有多个仓口卖饭,关系为1:m, –每个仓口卖饭可以有很多次,仓口与收费记录也是1:m 实现: drop da ...
最新文章
- 观察者模式的经典应用(猫叫 烧开水)
- 我的第一个纯手写jQuery插件
- 真正完美攻略之星月夜~Seven Tales in Spiral(中国同人文字AVG)
- 小而美的个人博客——前端——about
- 图论(六)图的两种表示方法
- oracle电梯案例,Oracle技术嘉年华的一个案例,redo的那些事,连载一
- NLP之路-Deep Learning in NLP (一)词向量和语言模型
- 最近30分钟合约市场爆仓702万美元 BTC爆仓281万美元
- java应用uploadify 3.2丢失session
- iOS【面试】2018年面试题集锦
- Autocad中批量调整增强属性块中的元素的位置
- jxl生成excel 设置隐藏列 隐藏行
- .NET Serviece安装及 启动报错(The Parameter is Incorrect)参数错误问题处理
- portSentry入侵检测工具
- linux下使用打印机
- 方案详解|AARRR+八角行为分析=用游戏化思维实现用户增长
- 微信个人号机器人接口
- 论文阅读笔记——[MPN]: Multi-task Learning with Coarse Priors for Robust Part-aware Person Re-identification
- Java顺序与选择结构实验问题,初中物理说课稿模板2
- 移动开发者服务平台Mob应邀亮相广东互联网大会