【读书笔记】设计模式第6章:行为型模式2

本文主要分析了中介者模式、观察者模式、备忘录模式、访问者模式、状态模式、解释器模式,介绍它们的定义、优缺点、使用场景,以及实例代码。为了深刻地理解设计模式,最重要的还是动手编写代码。

我参照书中的例程重新构想了一些更加生动、易于理解的例子,希望大家喜欢。

代码可以通过以下链接进行浏览:

http://git.oschina.net/caipeichao/java-design-pattern

这些代码都经过编译运行,保证没有错误。

  • 中介者模式

    • 定义

      • 也叫调停者模式
      • 用一个中介对象来封装一系列同事对象之间的交流,使得同事对象之间不需要显式地相互作用
      • 角色:抽象中介者、具体中介者、抽象同事、具体同事
    • 优点
      • 减少类之间的依赖
      • 避免同事对象之间的过度耦合
      • 将对象的行为和协作抽象化
    • 注意事项
      • 不应当在责任划分混乱的时候使用
      • 不应该在数据类和操作类之间使用
      • 正确理解封装
  • 观察者模式
    • 定义

      • 也叫发布订阅模式
      • 定义对象之间一种一对多的依赖关系,使得每当这个类被修改时,所有依赖于这个类的对象都会收到通知并得到更新
      • 角色:抽象主题、具体主题、抽象观察者、具体观察者
    • 优点
      • 观察者和被观察者之间是抽象耦合的
      • 支持广播通信
    • 缺点
      • 如果观察者非常多,则性能会变差
      • 如果有循环依赖关系,则会导致死循环
      • 如果是观察者异步执行的,需要保证观察者收到通知的顺序
      • 观察者无法知道对象是如何变化的
    • 使用场景
      • 关联行为场景
      • 事件多级触发场景
      • 跨系统的消息交换场景
    • 注意事项
      • 避免广播链。一个观察者也可以同时为被观察者。这种情况维护性很差
      • 异步处理问题。异步处理要考虑线程安全
  • 备忘录模式
    • 定义

      • 又称快照模式,Token模式
      • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存状态。这样,以后就可以恢复原先保存的状态了
      • 角色:发起人、备忘录、负责人(负责管理备忘录)
    • 使用场景
      • 需要保存和恢复数据的相关状态场景
      • 提供一个可回滚的操作
      • 需要监控副本的场景。用于记录日志,用作后续对程序分析
      • 数据库中的事务
    • 注意事项
      • 生命周期。建立备忘录之后就要使用,不使用就马上删除
      • 性能。不要频繁使用备忘录
  • 访问者模式
    • 定义

      • 封装一些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下,定义一种新的操作
      • 角色:抽象访问者、具体访问者、抽象元素、具体元素、结构对象
    • 优点
      • 容易增加新的操作
      • 将有关的行为集中到一个访问者的对象中,而不是分散到一个个元素中
      • 可以同时访问多个类中的私有成员
      • 累积状态。每个访问者都集中了相关的行为,所以在访问的过程中将执行操作的状态积累在自己内部,而不是分散到很多的元素中
    • 缺点
      • 不容易增加新的元素类型
      • 破坏封装性。访问者必须知道类中的实现细节
      • 违背了依赖倒置原则。访问者依赖于具体的元素,而不是抽象的元素
    • 使用场景
      • 一个对象包含很多类对象,由于它们有不同的接口,无法使用迭代器迭代每个对象。
      • 需要对一个对象结构体中的对象进行很多不相关的操作
      • 业务规则要求遍历多个不同类型的对象
  • 状态模式
    • 定义

      • 又称为状态对象模式
      • 当一个对象改变状态时,允许改变其行为,这个对象好像看起来改变了类型一样
      • 角色:抽象状态、具体状态、环境
    • 优点
      • 结构清晰
      • 遵循设计原则
      • 封装性良好
    • 缺点
      • 子类太多,不易维护
    • 使用场景
      • 行为随着状态的改变而改变的情形
      • 代码中存在很长的case语句
  • 解释器模式
    • 定义

      • 给定一门语言,定义它的文法表示,并定义一个解释器,该解释器使用该表达式来解释语言中的句子
      • 角色:抽象表达式、终结符表达式、非终结符表达式、环境、客户端
    • 优点
      • 简单的语法分析工具
      • 语法可扩展
    • 缺点
      • 类的数量过多
      • 采用递归调用
    • 使用场景
      • 解决重复发生的问题
      • 一个简单语法需要解释的场景
      • 正则表达

【读书笔记】设计模式第6章:行为型模式2,布布扣,bubuko.com

时间: 2024-10-13 22:03:53

【读书笔记】设计模式第6章:行为型模式2的相关文章

【读书笔记】计算机网络1章:课程介绍、协议、分层

这是我在Coursera上的学习笔记.课程名称为<Computer Networks>,出自University of Washington. 由于计算机网络才诞生不久,目前正在以高速在发展,所以有些旧的教材可能都已经跟不上时代了.这门课程在2013年左右录制,知识相对还是比较新的.覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得非常仔细.学完这门课程之后对计算机网络会有比较深刻的了解. 本章讲述了这门课程的大致情况,讲述了协议.协议层等基本概念. 目标和动机 课程的主要目标就是介绍计算

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1.2 INSERT SELECT 语句 8.1.3 INSERT EXEC 语句 8.1.4 SELECT INTO 语句 8.1.5 BULK INSERT 语句 8.1.6 标识列属性和序列对象 8.1.6.1 标识列属性 8.1.6.2 序列对象 8.2 删除数据 8.2.1 DELETE 语

读书笔记:计算机网络9章:QoS服务质量

章节概述 本章节主要讲QoS服务质量.涉及到网络层.传输层和应用层. QoS和用户需要得到的服务种类有关.不同的服务需要的带宽.延迟.丢包率都是不一样的.QoS是未来互联网的重要问题之一. 目前的互联网没有服务质量保证.因为目前的网络只是将数据包尽力投递到对方服务器,然而投递的速度.延迟.丢包率都是没有保障的.但是有时候"尽力"投递是不够的,因为有些应用需要有性能方面有保障,比如VoIP电话.虽然我们不能增加现有网络的带宽,但是我们可以给用户分配不同的带宽给用户带来更多利益. 举个例子

读书笔记:计算机网络8章:应用层

最近一个问题很困扰我,今天则得到了答案,也意味着我该选择了. 不知道大家有没有遇到过这样的情况,我是上年刚毕业,大四时进行过java培训,12年9月-13年4月,在这之前已经自学过java.7月份时进入一家公司工作,今年3月份辞职,4月份找到工作,来上班了.一开始就不太喜欢公司氛围,前台,hr,态度什么的都不太好,工作环境也极像客服部,整天电话不断,讨论声不断,第一个星期真是煎熬,去了两三天之后有辞职的想法,但是后面想想还是算了,公司待遇还可以. 但是进入到公司后leader让学PHP,学PHP

进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)

1.Unix shell的功能 shell是一个管理进程和运行程序的程序.所有常用的shell都有3个主要功能: (1)运行程序: (2)管理输入和输出 (3)可编程 shell同时也是带有变量和流程控制的编程语言. 2.Unix的进程模型 一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式的代码.运行一个程序意味着将这些机器指令序列载入内存然后让处理器(CPU)逐条执行.在Unix术语中,一个可执行程序是一些机器指令机器数据的序列.一个进程是程序运行时的内存空间和设

终端控制和和信号——《Unix/Linux编程实践教程》读书笔记(第6章)

1.有些程序处理从特定设备来的数据.这些与特定设备相关的程序必须控制与设备的连接.Unix系统中最常见的设备是终端. 2.终端驱动程序有很多设置.各个设置的特定值决定了终端驱动程序的模式.为用户编写的程序通常需要设置终端驱动程序为特定的模式. 3.键盘输入分为3类,终端驱动程序对这些输入做不同的处理.大多数建代表常规数据,它们从驱动程序传输到程序.有些键调用驱动程序中的编辑函数.如果按下删除键,驱动程序将前一个字符从它的行缓冲中删除,并将命令发送到终端屏幕,使之从显示器中删除字符.最后,有些键调

读书笔记:计算机网络第二章:物理层

这是我在Coursera上的学习笔记.课程名称为<Computer Networks>,出自University of Washington. 由于计算机网络才诞生不久,目前正在以高速在发展,所以有些旧的教材可能都已经跟不上时代了.这门课程在2013年左右录制,知识相对还是比较新的.覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得非常仔细.学完这门课程之后对计算机网络会有比较深刻的了解. 本章详细讲解了物理层,讲解了比特流如何通过各种介质进行传播. 基本概述 物理层的功能 专注比特信号是

读书笔记:计算机网络4章:网络层

这是我在Coursera上的学习笔记.课程名称为<Computer Networks>,出自University of Washington. 由于计算机网络才诞生不久,目前正在以高速在发展,所以有些旧的教材可能都已经跟不上时代了.这门课程在2013年左右录制,知识相对还是比较新的.覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得非常仔细.学完这门课程之后对计算机网络会有比较深刻的了解. 本章详细讲解了网络层的一些概念.通常网络层是通过IP协议实现的,网络层是所有协议的核心.本章介绍了I

事件驱动编程——《Unix/Linux编程实践教程》读书笔记(第7章)

1.curses库 /* 基本curses函数 */ initscr(); // 初始化curses库和tty endwin(); // 关闭curses并重置tty refresh(); // 使屏幕按照你的意图显示 move(r, c); // 移动光标到屏幕的(r, c)位置 addstr(s); // 在当前位置画字符串s addch(c); // 在当前位置画字符c clear(); // 清屏 standout(); // 启动standout模式(一般使屏幕反色) standend

I/O重定向和管道——《Unix/Linux编程实践教程》读书笔记(第10章)

1.I/O重定向的概念与原因 及 标准输入.输出的标准错误的定义 所以的Unix I/O重定向都基于标准数据流的原理.三个数据了分别如下: 1)标准输入--需要处理的数据流 2)标准输出--结果数据流 3)标准错误输出--错误消息流 概念:所以的Unix工具都使用文件描述符0.1和2.标准输入文件的描述符是0,标准输出的文件描述符是1,而标准错误输出的文件描述符则是2.Unix假设文件描述符0.1.2已经被打开,可以分别进行读写操作. 通常通过shell命令行运行Unix系统工具时,stdin.