`
冰糖葫芦
  • 浏览: 297852 次
社区版块
存档分类
最新评论

设计模式问答(二)

阅读更多

什么是解释器模式?

解 释器模式允许将语义解释到代码解决方案中。下面让我们来了解具体含义?语法是映射到类中来应用到解决方案中,例如7-2可以映射到‘clsMinus’ 类。在第一行解释器模式给我们提供了一种如何编写解释器的方案,该方案中解释器可以读取并在代码中执行该语法。例如以下例子中我们给出了一个日期格式化语 法,其中解释器给出了转换的代码解决方案并输出期望结果。


图1:日期语法

让我们来写一个如图“日期语法”中所示的日期格式化解释器。在开始之前我们需要理解解释器模式中不同组件,之后我们将映射相同的语法。Context包含数据,逻辑部分包含将context转换为可读格式的逻辑。


 

图2:上下文及逻辑

接 下来我们看看日期格式化中的语法。在定义任何语法之前,我们首先要把语法拆分为小的逻辑块。图“语法映射到类”展示了不同组件是如何确定的,然后映射到类 的语法只是实现了完整语法中的一部分。这样我们将日期格式化拆分为4个组件月、日、年以及分隔符;对这四个组件我们定义了不同的类来包含各自的逻辑,如图 “语法映射到类”中所示。因此,我们将为日期格式化中4个不同的组件创建不同的类。


图3:语法映射到类

如 前所述,有两个类其中一个是表达式类,该类包含逻辑;另一个是上下文类(context),该类包含数据,如图“表达式和上下文类”所示。我们将不同的解 析定义在不同的类中,所有这些类都继承自‘ClsAbstractExpression’接口,该接口包含‘Evaluate’方法;其中 ‘Evaluate’方法持有一个包含有数据的上下文类,并且通过表达式逻辑来解析数据。例如‘ClsYearExpression’会将‘YYYY’替 换为年份,’ClsMonthExpression’将‘MM’替换为月份等等。


图4:解释器模式类图


图5:表达式和上下文类

至 此我们已经将表达式解析逻辑封装在了不同的类中,现在我们来看下客户端使用逻辑。客户端首先传递日期格式化语法到上下文类;根据日期格式化我们添加表示类 到一个集合中。例如当发现“DD”表达式时会增加‘ClsDayExpression’,遇到‘MM’表达式时则会添加 ‘ClsMonthExpression’类,等等。最终我们循环调用这些类的‘Evaluate’方法。当所有类都被调用后我们就得到了显示结果。


图6:客户端效用解释器代码逻辑

什么是迭代器模式?

迭 代器模式允许在不暴露内部代码的情况下顺序存取元素。具体含义如下。假设有一个记录的集合,我们想顺序性浏览这些结合同时还想保存当前已经浏览的记录的位 置,那么迭代器模式就是我们所需要的。该模式是最常见且经常无意中使用的模式。在所有使用‘foreach’(允许顺序性循环一个集合)循环的地方我们就 在一定程度上在使用迭代器模式了。


图7:迭代器模式业务逻辑

在 图“迭代器模式业务逻辑”中我们定义了一个包含客户类集合的类‘clsIterator’。因此我们我们首先在‘clsIterator’中定义了一个 ArrayList以及一个‘FillObjects’方法来为ArrayList填充数据。这个消费者集合ArrayList是私有的 (private),并且客户数据可以通过集合中的下标来查找。因此我们开放了‘getByIndex’方法(通过指定下标来查找元素)、‘Prev’方 法(获得集合中前一个元素)、‘Next’方法(获取集合中下一个元素)、‘getFirst’方法(获取结合中第一个元素)、‘getLast’方法 (获取集合中最后一个元素)。

客户端只能看到这些方法,通过这些函数来顺序访问集合并且可以记住已经访问过的下标。

下图“客户端使用迭代器模式逻辑”展示了如何使用‘clsIterator’中next、previous、last、first函数以及指定下标来创建‘ObjIterator’对象的。


图8:客户端使用迭代器模式逻辑

什么是调停者模式?

很多时候项目中组件之间的通信是非常复杂的,因为组件之间的相互调用而变的复杂。调停者模式帮助对象以没有关联的方式来通信,这使得复杂度最小化。


图9:调停者模式简单例子

让我们考虑上图“调停者模式简单例子”中的情况,该图描述了一个真实场景中需要调停者模式的情况。它是一个非常用户友好的接口;它有3中典型场景:

场景1:当用户在文本框中输入文字后需要开启增加按钮以及清空按钮。在这个例子中文本框中为空,此时需要禁用增加和清空按钮。


图10:场景1

场景2:当用户点击添加按钮时数据应该进入到列表框中。一旦输入内容进入列表框,系统需要清空文本框并禁用增加和清除按钮。


图11:场景2

场景3:如果用户点击清除按钮系统应该清空文本框并禁用增加和清除按钮。


图12:场景3

从上图场景3中UI界面可以看出这些UI之间的交互是多么复杂。下图“组件之间的复杂交互”展示了逻辑的复杂性。


图13:组件之间的复杂交互

接着我们来看下图“调停者使用简化图”。各个组件之间并不是直接交互,而是都与一个中心化组件如调停者交互,由调停者来关注发送信息至其他组件,这样逻辑将变的干净清晰。


图14:调停者使用简化图

下面我们看看代码是如何写的。我们将使用C#但是大家也可以很容易的将其转换为java代码或者其他语言。下图“调停者类”展示的调停者类的完整代码。

调 停者类首先做的事情就是持有复杂交互相关类的引用。所以这里我们开放3个名为‘Register’的重载方法;‘Register’持有文本框对象和按钮 对象;场景的交互被集中在‘ClickAddButton’、’TextChange’、‘ClickClearButton’方法中,这些方法将根据不 同场景启用和禁用相关UI。


图15:调停者类

同 时客户端代码非常整洁。在构造函数中首先注册所有需要和调停者类交互的组件;接着对于每个场景只需要调用调停者类的方法即可。简而言之,当文本发生变化时 我们调用调停者类的‘TextChange’方法,当用户点击添加按钮时调用‘ClickAddButton’方法,当用户点击清空按钮时调用 ‘ClickClearButton’方法。


图16:调停者模式客户端逻辑

什么是备忘录模式?

备 忘录模式是提供一种在不破坏封装的情况下提供捕获对象内部状态的方式。它有助于存储对象的快照以便任何时候查询。下面我们来了解它在实际场景中的含义。下 图“备忘录模式实践例子”中展示的了一个客户屏幕;假设用户开始编辑一条客户记录并作出一些修改;过了一会以后该用户觉得操作有误想要恢复到原始数据,这 就是备忘录模式的适用场景。它帮助我们存储一份数据的拷贝并在用户点击取消时恢复到原始状态。


图17:备忘录模式实践例子

下 面我们来尝试使用C#完成我们刚刚讨论的客户UI的例子。以下是客户类‘clsCustomer’,该类聚合了存储数据快照的备忘录类 ‘clsCustomerMemento’。其中备忘录类‘clsCustomerMemento’是明确用来复制客户类(不包括方 法)‘clsCustomer’;当消费者类‘clsCustomer’初始化时,备忘录类也跟着初始化;当客户类数据发生改变时,备忘录类中的快照未发 生变化;其中‘Revert’方法可以将备忘录中的数据恢复到main类中。


图18:备忘录中的客户类

客户端代码非常简单。创建客户类,一旦有问题我们可以点击取消按钮来调用‘revert’方法将数据恢复至备忘录中的快照数据。图“备忘录客户端代码”图中展示了该逻辑。


图19:备忘录客户端代码

什么是观察者模式?

观 察者模式帮助我们完成父类和与他相关或依赖的类之间的通信。其中有两个比较重要的概念‘Subject’(主题)和‘Observers’(观察者)。主 题(subject)发送通知后,如果观察者注册到该主题,则会收到通知。下图“subject和observers”展示了应用(主题)发送通知到所有 观察者(email、事件日志、SMS)。我们也可以将这个例子封装成发布/订阅模型;发布者就是应用,订阅者就是email、事件日志、sms。


图20:subject和observers

接 下来我们尝试我们在前一小节中定义的简单示例代码。首先,我们先看看订阅者/通知类。图“订阅者类”展示了该代码,其中为所有订阅者定义了统一接口如 ‘INotification’,该接口有一个‘notify’方法。这个接口被所有具体的通知类实现,所有通知类定义自己的通知方法。对当前的场景来说 我们只是显示一个打印字符串来表示某个特定方法被执行。


图21:订阅者类

如前所示,观察者模式中分为两个部分,一个是观察者/订阅者,如前边我们提到的一样;另一个是发布者或者主题。

发布者有一个集合来存放所有需要收到通知的订阅者。通过使用‘addNotification’和‘removeNotification’可以从集合中增加或删除订阅者;使用‘NotifyAll’方法循环所有订阅者来发送通知。


图22:发布者/主题类

至此我们已经了解了发布致和订阅者类,下面让我们来些客户端代码并看看观察者表现。下面是一个观察者客户机代码片段。首先创建一个拥有订阅者集合的通知者对象,接着将需要被通知的订阅者添加到结合中。此时的逻辑是如果客户的代码长度超过10个字符时通知所有订阅者。


图24:观察者模式客户端代码

 

 

 

1. 本文由程序员学架构翻译

2. 本文译自

http://www.codeproject.com/Articles/28359/Design-pattern-FAQ-Part-Design-pattern-training

3. 转载请务必注明本文出自:程序员学架构(微信号:archleaner )

4. 更多文章请扫码:

0
0
分享到:
评论

相关推荐

    设计模式问答(2)Java开发Java经验技巧共18页.p

    这个压缩包文件“设计模式问答(2)Java开发Java经验技巧共18页.pdf.zip”显然包含了关于Java开发中的设计模式及其应用的深入讨论。下面,我们将详细探讨这些设计模式以及它们在Java开发中的重要性。 1. **单例模式...

    JAVA设计模式问答题[整理].pdf

    JAVA设计模式问答题[整理].pdf

    常见UI设计模式.pdf

    #### 二、常见UI设计模式详解 ##### 1. 主体/细节(Master/Detail)模式 - **概念**:这是一种典型的分屏设计模式,通常分为横向和纵向两种布局方式。 - **应用场景**:当需要在同一页面内展示不同级别的信息时,...

    C++设计模式课件25_Interpreter.pdf

    从提供的文件信息中,我们可以推断该课件《C++设计模式课件25_Interpreter.pdf》是关于C++语言实现设计模式中的解释器模式(Interpreter Pattern)的一部分教学资料。文件中出现的网站***和网易云课堂是指两个在线...

    设计模式总复习题.doc

    设计模式是软件工程中的一种重要概念,用于解决在软件设计中常见的问题,提供了一套可重用的解决方案。设计模式的出现使得开发者能够更高效地编写可维护、可扩展的代码,遵循一定的设计原则,提高代码质量。以下是...

    大话设计模式的源码 pdf文件在我空间免费下载

    本书的特色是通过小菜与大鸟的趣味问答,在讲解程序的不断重构和演变过程中,把设计模式的学习门槛降低,让初学者可以更加容易地理解——为什么这样设计才是好的?是怎样想到这样设计的?以达到不但授之以“鱼”,还...

    UML设计模式笔试题.doc

    UML设计模式笔试题 UML 设计模式笔试题是 Java 程序设计的重要组成部分,本文档涵盖了 UML 设计模式、Java 基础知识、多线程编程、Struts2 框架、MVC 模式、设计模式等多方面的知识点。 一、选择题 1. UML 设计...

    《JAVA设计模式》期末试题(A卷)[归纳].pdf

    《JAVA设计模式》期末试题(A卷)主要涵盖了设计模式的基础知识和应用,包括选择题、填空题、名词解释和综合问答四个部分,涉及到了多种设计模式的概念、分类、作用以及Java语言中与设计模式相关的编程原则。...

    智能问答机器人辅助的在线教学模式研究.pdf

    以C语言程序设计教学为例,构建教学领域的知识图谱,可以辅助智能问答机器人更有效地理解和解答课程相关问题。机器人通过对问题的分析、信息检索和答案抽取,为学生提供及时的解答。同时,通过对大量问答日志的分析...

    android 网络应用轻量框架-多线程管理-高效缓存-设计模式

    问答是happy http://blog.csdn.net/b275518834/article/details/8247685 操作方式:输入文本框设置线程数 点击第一个按钮请求10个地址信息 点击第二个按钮中断10个地址信息 1:判断当前网络环境 2:编写了3套...

    java毕业设计-课程设计-问答论坛系统

    1. **MVC设计模式**:Model-View-Controller模式是Web应用开发中常用的设计模式,它将业务逻辑、数据模型和用户界面分离,使得代码更易于维护和扩展。 2. **Servlet与JSP**:Servlet用于处理HTTP请求,JSP则用于...

    基于epoll的推送和问答模式服务器

    总结,基于epoll的服务器设计充分利用了epoll的高效特性,实现了推送和问答模式的结合,是学习网络编程和并发处理的优秀实践案例。通过理解和掌握这个项目,开发者能够更好地理解epoll的工作原理以及如何利用它构建...

    基于springboot的问答管理系统

    2. **MVC架构**:SpringBoot支持Model-View-Controller(MVC)设计模式,用于处理Web请求。在问答系统中,模型代表数据模型,视图负责展示,控制器接收并处理用户请求,协调模型和视图的交互。 3. **Spring Data ...

    医院在线问答系统的设计与实现_kaic.docx

    《医院在线问答系统的设计与实现》是一篇关于构建医院信息化管理平台的毕业论文。该系统旨在解决传统医院管理模式中存在的问题,如就诊等待时间过长、人力资源浪费等,通过数字化手段提高医疗服务质量和效率。 1. ...

    c#简易问答系统.zip

    8. 设计模式:根据系统规模和复杂度,可能会应用到设计模式,如工厂模式用于创建问题和答案对象,单例模式用于保证问答系统的全局唯一性。 9. 测试:为了确保系统功能的正确性,需要进行单元测试和集成测试。C#中的...

    人工智能自动问答系统方案设计.pptx

    目录 第一部分 人工智能大数据概览 第二部分 知识图谱技术概览 第三部分 自动问答解决方案 人工智能自动问答系统方案设计全文共33页,当前为第2页。 我国的大数据+人工智能战略 国外 2016年初,AlphaGo在围棋领域...

    java知识问答服务器

    这种设计模式是典型的C/S(客户端/服务器)架构,其中服务器端是服务的提供者,客户端是服务的消费者。 在描述中提到了“接口”,这可能是指Java中的接口(Interface)。在Java中,接口是一种完全抽象的类型,定义...

    JAVA知识问答器

    总之,【JAVA知识问答器】是一个综合运用了Java核心特性和设计模式的项目,通过它不仅可以学习到Java的基础语法,还可以深入理解面向对象设计、资源管理以及数据持久化等方面的知识。对于初学者来说,这是一个极好的...

    tipask问答系统111

    问答系统是互联网上常见的信息交流工具,它允许用户提出问题并由其他用户或专家给出回答,类似于现实生活中的一种社区互助模式。 【标签】"问答系统11111"强调了这个主题的核心——问答系统,可能是为了突出其在...

Global site tag (gtag.js) - Google Analytics