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

设计模式问答(三)

阅读更多

什么是状态模式?

状态模式允许一个对象根据当前对象的值来决定其行为。如下图“状态模式示例”是一个关于电灯泡操作的例子。如果电灯的状态为关,当按下开关时状态将打开;如果开关为开,则按下开关灯关闭。简而言之,根据不同的状态行为会发生变化。

图1:状态模式示例

下 面我们尝试使用C#实现该示例。图“状态模式实践”展示了业务类和客户端代码。我们创建了一个类‘clsState’,该类包含有两个状态“On”和 “Off”枚举;还定义了‘PressSwitch’方法,它根据当前状态来切换状态。在图右半部分我们实现了使用类‘clsState’的客户端来调用 ‘PressSwitch方法,并使用‘getStatus’方法将当前状态显示在文本框中。

当我们点击后会来回切换当前状态。

图2:状态模式实践

什么是策略模式?

策略模式在类中封装了算法,可以根据所使用的类来互换。当我们想在运行时决定使用哪个算法时这种模式非常有用。

下 面来看一个策略模式工作原理的例子。我们以数学运算中的加、减为例,图“策略模式实践”展示了该逻辑。它接收连个数字作为参数,根据不同的策略给出不同的 结果。因此,如果使用的是加法策略,那么两个数字会被相加;如果使用的是减法策略,那么两个数字将被相减。这些策略仅仅是算法。策略模式也仅仅是对算法的 封装。

图3:策略模式实践

首 先我们需要知道的是这些算法是如何被封装到类中的。下图“算法封装”展示了“add”算法是如何被封装到‘clsAddStatergy’类、 ‘substract’算法是如何被封装到‘clsSubstractStatergy’类中的;而这些类都继承自‘clsStratergy’类,该类 为子类提供了一个‘calculate’方法。

图4:算法封装

接着定义包装类‘clsMaths’来引用‘clsStatergy’类,并通过‘setStatergy’来设置需要使用的策略类。

图5:策略类及其包装类

下图“策略模式调用代码”展示了包装类的用法以及在运行时通过‘setStatergy’方法设置策略。

图6:策略模式调用代码

什么是访问者模式?

访问者模式允许在不改变实际类的情况下修改类结构。它是一种将逻辑和算法从当前出具结构中分离开来的方式。基于这种方式我们可以在不修改结构的情况下来为当前数据增加新的逻辑;另一方面,我们可以在不接触逻辑的情况下修改数据结构。

下 图“逻辑和数据结构”包含了一个消费者数据结构,每个消费者对象都有多个地址对象,每个地址对象又有多个电话对象。这个数据结构需要以两种不同的格式展 示:String、XML。因此我们需要写两个类其中一个是String相关逻辑的类,另一个是XML逻辑相关的类。这两个类遍历对象结构并给出相应的输 出。简而言之,访问者包含了逻辑。

图7:逻辑和数据结构

接着我们用C#来实现上面例子。其他编程语言同理。我们创建了连个访问者类来分别解析string逻辑和xml。这两个类都有一个visit方法来解析相应对象。为了保持统一这些类都实现了一个‘IVisitor’通用接口。

图8:访问者类

之前定义的访问者类将被传递给数据结构类,如消费者类。所以,在消费者类中,我们在‘Accept’函数中传入访问者类。在该方法中我们通过传递这种访问者类的类型来调用visit方法;同时visit方法做了重载,因此它将根据所传递的参数类的类型来决定调用哪个方法。

图9:传递访问者类到数据结构

由 于每个消费者都有多个地址,每个地址都有多个电话对象,因此在‘clsCustomer’类中集成有‘objAddresses’集合,而在 ‘clsAddress’类中则集成有‘objPhones’集合。每个对象都有accept方法并持有访问者类对象并在访问者类中的visit方法中解 析自己。由于visit方法的经过重载,所以它将多态的调用适当的方法。

图10:消费者、地址、电话对象

现 在我们定义好了访问者类的逻辑和消费者类的内部数据结构,接着可以在客户端使用它们了。下图“访问者模式客户端代码”展示了使用访问者模式的代码快照。首 先创建访问者对象并将其传递给消费者数据类;如果我们想要以字符串形式展示消费者对象数据结构,那么就创建‘clsVisitorString’,如果想 以xml格式展示,则需创建‘clsXML’对象并将其传递到消费者对象数据结构中。从数据结构中我们可以很容易明白该逻辑。

图11:访问者模式客户端代码

访问者模式和策略模式的区别?

访 问者模式和策略模式看起来非常相似,因为它们都是从数据中封装负责逻辑。可以说访问者模式是策略模式的通用形式。在策略模式中,在多个算法之上有一个上下 文或者单一的逻辑数据对象。在前一个问题中我们解释了策略模式和访问者模式的基本原理,那么让我们再次看下之前已经理解的例子。在策略模式中有一个单一的 上下文类和多个算法。图“策略模式”展示该上下文类和多个算法之间是如何协调工作的。

图12:策略模式

访问者模式有多个上下文对象,每个上下文对象都包含有一个算法。在访问者模式的例子中我们写过解析数据的例子如消费者、地址、电话对象。

图13:访问者模式

因 此,简而言之策略模式是访问者模式的特殊形式。在策略模式中,所有的算法只有一个上下文而访问者模式则每个算法对象都有一个上下文。所以对于选择使用策略 模式还是访问者模式的基本标准就是上下文和算法之间的关系。如果需要一个上下文、多个算法,那么就选择策略模式;如果有多个上下文和算法就选择使用访问者 模式。

什么是适配器模式?

很 多时候两个类由于继承自不兼容的接口而变得不兼容。适配器模式帮助我们来包装已存在的类使得两个类变得互相兼容。下图“不兼容接口”中两个集合都持有一个 string值;它们都有一个方法来增加一个字符串到集合中;其中一个方法是‘Add’另一个是‘Push’;一个使用的集合对象而另一个使用的栈。我们 想要使栈对象和集合对象兼容。

图14:不兼容接口

有两种方法实现适配器模式,一种是聚合(这种方式称为对象适配器模式),另一种是继承(这种方式称为类适配器模式)。首先我们来看看对象适配器模式。

下图“对象适配器模式”展示了一个广泛的实现方式。该例子中我们引入了一个新的包装类‘clsCollectionAdapter’,该类包装了‘clsStack’类并且将push方法包含在add方法之中,这样使得两个类变得兼容。

图15:对象适配器模式

另一种方式是使用继承来实现适配器模式,也叫类适配器模式。图“类适配器模式”展示了类‘clsStack’如何通过继承‘clsCollectionAdapter’使得兼容‘clsCollection’类。

图16:类适配模式

什么是享元模式?

当 我们需要创建很多对象并且这些对象都共用一种数据时享元模式非常有用。下图“对象和共用数据”中,我们需要为组织中所有员工打印名片,这样我们有两部分数 据一种是可变数据如员工名称,另一个部分是静态数据如地址。通过只保留一份静态数据并使所有可变对象引用该地址这种方式,可以使内存使用最小化。因此我们 创建不同的可变数据但是都引用同一份静态数据,这样可以优化对内存的使用。

图17:对象和通用数据

以 下是享元模式的一个C#代码实例。其中有两个类:‘clsVariableAddress’来保存动态数据,‘clsAddress’来保存静态数据;为 了确保‘clsAddress’类只有一个实例,我们创建了一个包装类‘clsStatic’以及‘clsAddress’类的静态实例。这个类聚合了 ‘clsVariableAddress’类。

图18:享元模式类图

下图“享元模式客户端代码”中我们创建了‘clsVariableAddress’类的两个对象,但是内部的静态数据如地址类则只有一个实例。

图19:享元模式客户端代码

 

 

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

2. 本文译自 http://www.codeproject.com/Articles/28384/Design-pattern-FAQ-Part-Design-pattern-training

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

4. 更多文章请扫码:

2
0
分享到:
评论

相关推荐

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

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

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

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

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

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

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

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

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

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

    【毕业设计】基于深度学习的视觉问答.zip

    对于视觉问答(VQA)的研究具有深刻的学术意义和广阔的应用前景。目前,视觉问答模型性能提升的重点在于图像特征的提取,文本特征的提取,attention权重的计算和图像特征与文本特征融合的方式这4个方面。本文主要...

    基于Java的A校招生咨询智能问答系统的设计与实现【附源码】

    A校招生咨询智能问答系统主要功能模块包括资讯数据管理、用户注册管理、留言管理、网上咨询管理、智能问答、系统管理,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应...

    问答系统的系统设计方案.pdf

    问答系统的系统设计⽅案 问答系统的系统设计⽅案 问答系统的系统设计⽅案 问答系统的系统设计⽅案 ⼀、软件架构风格 ⼀、软件架构风格 "每⼀个模式描述了⼀个在我们周围不断重复发⽣的问题及该问题解决⽅案的核⼼。...

    WeCenter社交化问答系统 v3.1.9社交问答 问答系统 问答程序

    Wecenter(微中心系统软件)是一款由深圳市微客互动有限公司开发的具有完全自主知识产权的开源软件。它安全,可靠,快速更迭,可以迅速帮助企业和组织通过微信,微薄,APP,网页...Web 版模板设计调整 手机版模板重构

    图像问答系统_java web版本

    图像问答系统的设计与实现,可以作为项目来学习,主要功能调用了百度AI开放平台的服务实现。 缺点:(1).没有调用框架,只使用了MVC开发模式。 (2).部分功能兼容IE浏览器,不兼容chrome浏览器。

    spring面试问答.pdf

    spring和springMVC的一些面试题问答,包含Spring 事务底层原理 、启动、运行流程、设计模式等

    基于深度学习的视觉问答系统源码+文档说明+答辩ppt(高分毕业设计).zip

    基于深度学习的视觉问答系统源码+文档说明+答辩ppt(高分毕业设计).zip的主要工作在于本文使用open-ended模式,答案的准确率采用分数累积,而不是一般的多项选择。本文采用CSF模块(包括CSF_A和CSF_B)不仅对...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    Java面试问答,免费下载

    java集合、基础、jvm、spingmybatis、mysql、计网、线程、设计模式、nginx、Kafka、Linux、RabbitMQ等等面试问答(包含答案),免费下载

    基于Bert知识三元组的简单的问答系统python源码+项目说明(joint+pipeline模式).zip

    基于Bert知识三元组的简单的问答系统python源码+项目说明(joint+pipeline模式).zip 本项目是一个基于知识三元组的简单的问答系统,分为joint和pipeline两种模式。joint模式为基于bert做意图识别和命名体识别的联合...

    问答类APP创业策划书.zip

    在这份策划书中,我们可以看到一个精心设计的问答类APP的蓝图。它立足于解决现代人在日常生活、工作、学习中遇到的各种问题,通过智能匹配与高效互动,为用户提供一个便捷、准确的问答平台。这个平台不仅可以帮助...

    人工智能问答.docx

    人工智能问答全文共2页,当前为第1页。人工智能问答全文共2页,当前为第1页。...模式识别16数据挖掘与数据库中的知识发现17.计算机辅助创新18.计算机文艺创作19.机器博弈20.智能机器人 人工智能问答

    软件工程问答题.docx

    1软件是设计开发的,而不是传统意义上生产制造的。2软件不会"磨损"。 3虽然整个工业向着基于构件的构造模式发展,然而大多数软件仍是根据实际的顾客需求定制的。 What is equivalence partitioning as it applies ...

    基于知识图谱的智能问答机器人.pdf

    本系统实现⽬标和内容 本系统实现⽬标和内容 本⽂针对实验室这⼀关系领域构建知识图谱,基于Neo4j(⾮关系型数据库)建⽴学⽣、⽼师、项⽬三个实体的关系⽹络,使⽤Python AIML 搭建智能问答机器⼈开发环境,将⼆者...

    汉语问答系统关键技术研究 吴友政

    本文针对汉语问答技术展开深入研究 [1] 建立了一个具有一定规模并可扩充的汉语问答技术评测平台 [2] 提出了汉语问答系统的提问分类体系及基于多特征的提问分类算法 ...[5] 提出了基于无监督学习的问答模式抽取技术

Global site tag (gtag.js) - Google Analytics