知识大全 使用设计模式改善程序结构

Posted

篇首语:学在苦中求,艺在勤中练。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用设计模式改善程序结构相关的知识,希望对你有一定的参考价值。

  设计模式是对特定问题经过无数次经验总结后提出的能够解决它的优雅的方案 但是 如果想要真正使设计模式发挥最大作用 仅仅知道设计模式是什么 以及它是如何实现的是很不够的 因为那样就不能使你对于设计模式有真正的理解 也就不能够在自己的设计中正确 恰当的使用设计模式 本文试图从另一个角度(设计模式的意图 动机)来看待设计模式 通过这种新的思路 设计模式会变得非常贴近你的设计过程 并且能够指导 简化你的设计 最终将会导出一个优秀的解决方案          介绍         在进行项目的开发活动中 有一些设计在项目刚刚开始工作的很好 但是随着项目的进展 发现需要对已有的代码进行修改或者扩展 导致这样做的原因主要有 新的功能需求的需要以及对系统进一步理解 在这个时候 我们往往会发现进行这项工作比较困难 即使能完成也要付出很大的代价 此时 一个必须要做的工作就是要对现有的代码进行重构(refactoring) 通过重构使得我们接下来的工作变得相对容易         重构就是在不改变软件系统代码的外部行为的前提下 改善它的内部结构 重构的目标就是使代码结构更加合理 富有弹性 能够适应新的需求 新的变化 对于特定问题给出优美解决方案的设计模式往往会成为重构的目标 而且一旦我们能够识别出能够解决我们问题的设计模式 将会大大简化我们的工作 因为我们可以重用别人已经做过的工作 但是在我们的原始设计和最终可能会适用于我们的设计模式间的过渡并不是平滑的 而是有一个间隙 这样的结果就是 即使我们已经知道了很多的设计模式 面对我们的实际问题 我们也没有一个有效的方法去判断哪一个设计模式适用于我们的系统 我们应该去怎样应用它         造成上述问题的原因往往是由于过于注重设计模式所给出的解决方案这个结果 而对于设计模式的意图 以及它产生的动机却忽略了 然而 正是设计模式的意图 动机促使人们给出了一个解决一类问题的方案这个结果 设计模式的动机 意图体现了该模式的形成思路 所以更加贴近我们的实际问题 从而会有效的指导我们的重构历程 本文将通过一个实例来展示这个过程         在本文中对例子进行了简化 这样做是为了突出问题的实质并且会使我们的思路更加清晰 思路本身才是最重要 最根本的 简化了的例子不会降低我们所展示的思路 方法的适用性          问题描述         一个完善的软件系统 必须要对出现的错误进行相应的处理 只有这样才能使系统足够的健壮 我准备以软件系统中对于错误的处理为例 来展示我所使用的思路 方法         在一个分布式的网管系统中 一个操作往往不会一定成功 常常会因为这样或者那样的原因失败 此时我们就要根据失败的原因相应的处理 使错误的影响局限在最小的范围内 最好能够恢复而不影响系统的正常运行 还有一点很重要 那就是在对错误进行处理的同时 一定不要忘记通知系统的管理者 因为只有管理者才有能力对错误进行进一步的分析 从而查找出错误的根源 从根本上解决错误         下面我就从错误处理的通告管理者部分入手 开始我们的旅程 假定一个在一个分布式环境中访问数据库的操作 那么就有可能因为通信的原因或者数据库本身的原因失败 此时我们要通过用户界面来通知管理者发生的错误 简化了的代码示例如下             /* 错误码定义 */    class ErrorConstant        public static final int ERROR_DBACCESS = ;    public static final int ERROR_MUNICATION = ;            /* 省略了用户界面中的其他的功能 */    class GUISys        public void announceError(int errCode)         switch(errCode)         case ErrorConstant ERROR_DBACCESS:    /* 通告管理者数据库访问错误的发生*/    break;        case ErrorConstant ERROR_MUNICATION:    /* 通告管理者通信错误的发生*/    break;                             开始 这段代码工作的很好 能够完成我们需要的功能 但是这段代码缺少相应的弹性 很难适应需求的变化          问题分析         熟悉面向对象的读者很快就会发现上面的代码是典型的结构化的方法 结构化的方法是以具体的功能为核心来组织程序的结构 它的封装度仅为 级 即仅有对于特定的功能的封装(函数) 这使得结构化的方法很难适应需求的变化 面向对象的方法正是在这一点上优于结构化的方法 在面向对象领域 是以对象来组成程序结构的 一个对象有自己的职责 通过对象间的交互来完成系统的功能 这使得它的封装度至少为 级 即封装了为完成自己职责的方法和数据 另外面向对象的方法还支持更高层次的封装 比如 通过对于不同的具体对象的共同的概念行为进行描述 我们可以达到 级的封装度- 抽象的类(在Java中就是接口) 封装的层次越高 抽象的层次就越高 使得设计 代码有越高的弹性 越容易适应变化         考虑对上一节中的代码 如果在系统的开发过程中发现需要对一种新的错误进行处理 比如 用户认证错误 我们该如何做使得我们的系统能够增加对于此项功能的需求呢?一种比较简单 直接的做法就是在增加一条用来处理此项错误的case语句 是的 这种方法的确能够工作 但是这样做是要付出代价的         首先 随着系统的进一步开发 可能会出现更多的错误类型 那么就会导致对于错误的处理部分代码冗长 不利于维护 其次 也是最根本的一点 修改已经能够工作的代码 很容易引入错误 并且在很多的情况下 错误都是在不经意下引入的 对于这种类型的错误很难定位 有调查表明 我们在开发过程中 用于修正错误的时间并不多 大部分的时间是在调试 发现错误 在面向对象领域 有一个很著名的原则 OCP(Open Closed Principle) 它的核心含意是 一个好的设计应该能够容纳新的功能需求的增加 但是增加的方式不是通过修改又有的模块(类) 而是通过增加新的模块(类)来完成的 如果一个设计能够遵循OCP 那么就能够有效的避免上述的问题         要是一个设计能够符合OCP原则 就要求我们在进行设计时不能简单的以功能为核心 要实现OCP的关键是抽象 抽象表征了一个固定的行为 但是对于这个行为可以有很多个不同的具体实现方法 通过抽象 我们就可以用一个固定的抽象的概念来代替哪些容易变化的数量众多的具体的概念 并且使得原来依赖于哪些容易变化的概念的模块 依赖于这个固定的抽象的概念 这样的结果就是 系统新的需求的增加 仅仅会引起具体的概念的增加 而不会影响依赖于具体概念的抽象体的其他模块 在实现的层面上 抽象体是通过抽象类来描述的 在Java中是接口(interface) 关于OCP的更详细描述 请参见参考文献[ ]         既然知道了问题的本质以及相应的解决方法 下面就来改善我们的代码结构          初步方案         让我们重新审视代码 看看该如何进行抽象 在错误处理中 需要处理不同类型的错误 每个具体的错误具有特定于自己本身的一些信息 但是它们在概念层面上又是一致的 比如 都可以通过特定的方法接口获取自已内部的错误信息 每一个错误都有自己的处理方法 由此可以得到一个初步的方案 可以定义一个抽象的错误基类 在这个基类里面定义一些在概念上适用于所有不同的具体错误的方法 每个具体的错误可以有自己的不同的对于这些方法的实现 代码示例如下         interface ErrorBase        public void handle()     public String getInfo();             class DBAccessError implements ErrorBase        public void handle()     /* 进行关于数据库访问错误的处理 */             public String getInfo()     /* 构造返回关于数据库访问错误的信息 */                 class CommunicationError implements ErrorBase        public void handle()     /* 进行关于通信错误的处理 */             public String getInfo()     /* 构造返回关于通信错误的信息 */                      这样 我们就可以在错误发生处 构造一个实际的错误对象 并以ErrorBase引用它 然后 交给给错误处理模块 此时错误处理模块就仅仅知道一个类型ErrorBase 而无需知道每一个具体的错误类型 这样就可以使用统一的方式来处理错误了 代码示例如下         class GUISys        public void announceError(ErrorBase error)     /* 使用一致的方式处理错误 */     er cha138/Article/program/Java/gj/201311/27432

相关参考

知识大全 数据结构概论之学习数据结构的意义

  数据结构是介于数学计算机硬件和计算机软件三者之间的一门核心课程  在计算机科学中数据结构不仅是一般程序设计的基础而且是设计和实现编译程序操作系统数据库系统及其它系统程序和大型应用程序的重要基础  

知识大全 数据结构与算法设计自学考试大纲[7]

考试方式闭卷笔试时间为分钟题型结构填空题()多项选择题改错题()程序填空题简答题()编写程序题单项选择题()算法设计题难度结构  本课程考试主要测试考生对数据结构的基本概念基本原理和基本算法的理解掌握

知识大全 数据结构之抽象数据类型[1]

  首先我们回顾一下在程序设计语言中出现的各种数据类型  数据类型  数据类型是和数据结构密切相关的一个概念它最早出现在高级程序设计语言中用以刻划程序中操作对象的特性在用高级语言编写的程序中每个变量常

知识大全 数据结构之算法和算法分析[3]

  为了解决理解与执行这两者之间的矛盾人们常常使用一种称为伪码语言的描述方法来进行算法描述伪码语言介于高级程序设计语言和自然语言之间它忽略高级程序设计语言中一些严格的语法规则与描述细节因此它比程序设计

知识大全 数据结构与算法设计自学考试大纲[1]

数据结构与算法设计()自学考试大纲一课程的性质及其设置目的课程的性质地位与任务  数据结构是研究程序设计中计算机的操作对象以及它们之间的关系和运算的一门学科本课程是计算机及应用专业(独立本科段)的专业

知识大全 数据结构与算法设计自学考试大纲[2]

二课程内容和考核目标第一章绪论  本章介绍了数据结构的内容和方法几种基本数据结构以及抽象数据类型的概念阐述了问题数学模型算法与程序之间的关系对算法算法设计目标算法的描述以及算法分析方法作了较详细的介绍

知识大全 数据结构复习指导

  第一章绪论  一概念  数据结构是一门研究程序设计中计算机操作的对象以及它们之间的关系和运算的一门学科  数据是描述额观事物的数字符以及所有能输入到计算机中被计算机程序加工处理的信息的集合  数据

知识大全 实现高可用性设计的奥秘

  高可用性要求一种合适的基础结构但是如果没有将该基础结构与JEE应用程序设计策略进行协调平衡性能很可能就会受损    如果您在高可用性硬件和软件基础结构方面投资了一笔数目可观的资金您就必须保证应用程

知识大全 新手浅谈数据库中的设计技巧(一)

  说到数据库我认为不能不先谈数据结构年在我初入大学学习计算机编程时当时的老师就告诉我们说计算机程序=数据结构+算法尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主但我还是深深赞同年前老师的告

知识大全 一个学生学习数据结构的体会[2]

  在设计数学模型的过程中实际上就引出了数据结构的概念本书中作者给出的定义是简单来说数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科国内的教材为了语言上的严