设计模式之观察者模式(Observer pattern)
最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下:
上课铃声响起,学生A/B/C/D进入教室;下课铃声响起,学生A/B/C/D离开教室。
要求使用设计模式的思想完成铃与学生两个类的解耦并画出UML类图。
看到这道题之后自己第一时间便想到了装饰器模式,定义一个装饰类继承铃的接口,在上课铃与下课铃的接口中添加学生们的动作,UML类图如下:

最后的确做到了解耦,但总觉得与装饰器模式的应用场景不太匹配,最后面试官给了个提示——观察者模式——于是豁然开朗,本题的场景毫无疑问更适合使用观察者模式来解决,观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
该道题使用观察者模式的UML类图如下:

实现代码如下(Java:jdk1.8.0_144):
import java.util.Observable;
public abstract class IBell extends Observable {
public enum State {
上课, 下课
}
public abstract void firstRing();
public abstract void secondRing();
}
public class Bell extends IBell {
@Override
public void firstRing() {
System.out.println("上课铃响了!!!");
super.setChanged();// 修改对象状态才能触发观察者的通知事件
this.notifyObservers(State.上课);
}
@Override
public void secondRing() {
System.out.println("下课铃响了!!!");
super.setChanged();// 修改对象状态才能触发观察者的通知事件
this.notifyObservers(State.下课);
}
}
import java.util.Observable;
import java.util.Observer; import org.lxp.dailylog.web.util.IBell.State; public abstract class IStudent implements Observer {
public abstract void enterClassRoom(); public abstract void leaveClassRoom(); @Override
public void update(Observable o, Object arg) {
switch (State.valueOf(arg.toString())) {
case 上课:
enterClassRoom();
break;
case 下课:
leaveClassRoom();
break;
}
} }
public class Student extends IStudent {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void enterClassRoom() {
System.out.println("Student " + this.name + " enters classroom");
}
@Override
public void leaveClassRoom() {
System.out.println("Student " + this.name + " leaves classroom");
}
}
public class Test {
public static void main(String[] args) {
Student A = new Student("A");
Student B = new Student("B");
Student C = new Student("C");
Student D = new Student("D");
Bell bell = new Bell();
bell.addObserver(D);
bell.addObserver(C);
bell.addObserver(B);
bell.addObserver(A);
bell.firstRing();
bell.secondRing();
}
}
输出结果如下:

设计模式之观察者模式(Observer pattern)的更多相关文章
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 二十四种设计模式:观察者模式(Observer Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- [设计模式] 19 观察者模式 Observer Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...
- c#设计模式之观察者模式(Observer Pattern)
场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...
- 设计模式九: 观察者模式(Observer Pattern)
简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...
- 【设计模式】观察者模式 Observer Pattern
定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象 ...
- 【UE4 设计模式】观察者模式 Observer Pattern
概述 描述 定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做 发布-订阅(Publish/Subscribe)模式 模型-视图(M ...
- 设计模式-观察者模式(Observer Pattern)
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...
- 设计模式 - 观察者模式(Observer Pattern) 详细说明
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
随机推荐
- ThinkPHP __construct和_initialize的使用
ThinkPHP框架中的__construct和_initialize的使用 父类(PlatformController.class.php): class PlatformController ex ...
- phpstorm的破解
按照PHPstorm进入如下页面: 然后继续单击License server 输入:http://www.0-php.com:1017 PHPstorm完美运行!!!!!
- 库操作&表操作
系统数据库 ps:系统数据库: mysql 授权库,主要存储系统用户的 权限信息 test MySQL数据库系统自动创建的 测试数据库 ination_schema 虚拟库,不占用磁盘空间,存储的是数 ...
- hdu1875kruskal简单应用。
标记是dificulty 2,水,开始kruskal时练手题,只需开始时数据处理下,不符合要求的边不要,要理解并查集和Kruskal,就简单了,判断下是否联通图,(只需在记加入有效边时候统计连通分支数 ...
- 【纯净版windows系统】U盘启动制作图文教程
无废话,按照步骤来就可以. 1.一个大于4G的U盘(格式化)准备好U盘,请注意制作过程中对U盘有格式化操作,有用的东西请先备份 2.UltraISO(软碟通软件)下载安装百度“软碟通”,或者访问 ht ...
- 检查nginx配置,重载配置以及重启的方法
原文 http://blogread.cn/it/article/4549?f=hot1 几个常用的nginx命令 Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信 ...
- IT桔子 - 千里马俱乐部
IT桔子 - 千里马俱乐部 浙江
- react 路由 react-router@3.2.1
react路由,4.x的差异还是比较大,暂时还是3.x的版本 安装: npm install -S react-router@3.x 配置: import { Router, Route, hashH ...
- 【转载】HTTP协议与WEB本质
当你在浏览器地址栏敲入"http://www.csdn.net/",然后猛按回车,呈现在你面前的,将是csdn的首页了(这真是废话,你会认为这是理所当然的).作为一个开发者,尤其是 ...
- MySQL存储结构的使用
前言 今天公司老大让我做一个MySQL的调研工作,是关于MySQL的存储结构的使用.这里我会通过3个样例来介绍一下MySQL中存储结构的使用过程,以及一些须要注意的点. 笔者环境 系统:Windows ...