最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下:

上课铃声响起,学生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)的更多相关文章

  1. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  2. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  3. [设计模式] 19 观察者模式 Observer Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...

  4. c#设计模式之观察者模式(Observer Pattern)

    场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...

  5. 设计模式九: 观察者模式(Observer Pattern)

    简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...

  6. 【设计模式】观察者模式 Observer Pattern

    定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象 ...

  7. 【UE4 设计模式】观察者模式 Observer Pattern

    概述 描述 定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做 发布-订阅(Publish/Subscribe)模式 模型-视图(M ...

  8. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  9. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

随机推荐

  1. 全局Session-GlobalSession

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.spri ...

  2. poj - 3686 The Windy's (KM算法)

    题意:n个订单和m个生产车间,每个订单在不同的车间生产所需要的时间不一样,并且每个订单只能在同一个车间中完成,直到这个车间完成这个订单就可以生产下一个订单.现在需要求完成n个订单的平均时间最少是多少. ...

  3. .NET Core 3.0之深入源码理解Configuration(一)

    Configuration总体介绍 微软在.NET Core里设计出了全新的配置体系,并以非常灵活.可扩展的方式实现.从其源码来看,其运行机制大致是,根据其Source,创建一个Builder实例,并 ...

  4. List和Map、Set的区别

    首先 List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合:List 中存储的数据是有顺序,并且允许重复:Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可 ...

  5. 关于Java第一次实验的对课后问题自己的理解--验证码实现及其四则运算

    问题一.对于课上ppt中EnumTest所提出的的问题进行解答 将这段代码放到文件中进行运行后发现 1.对应的Size中不同元素的并不是同一个对象 2.以其中一个枚举类型s来说,不是原始数据,即他们都 ...

  6. 每日一个linux命令(1)

    ls命令: 1.        ls -l -R /home/文件夹   列出/home/文件夹下所有文件和目录的详细资料 2.        ls -l t*                     ...

  7. 扫描仪共享工具(BlindScanner Pro) 3.23 特别版

    http://www.xdowns.com/soft/1/126/2014/Soft_125206.html

  8. N+6 裁员裁出幸福感的背后

    01. 史上最牛逼的数据库公司,Oracle 裁员了. 2019年5月7日,甲骨文召开了面向全中国区的电话会议,亚太区人力资源负责人在会上简要介绍道,公司正进行业务结构调整,导致一部分人要离开岗位,这 ...

  9. 从壹开始前后端分离【重要】║最全的部署方案 & 最丰富的错误分析

    缘起 哈喽大家好!今天是周一了,这几天趁着午休的时间又读了一本书<偷影子的人>,可以看看

  10. 条款一:尽量使用const、inline而不是#define

    #define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号 ...