设计模式之我见论文_第1页
设计模式之我见论文_第2页
设计模式之我见论文_第3页
设计模式之我见论文_第4页
设计模式之我见论文_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录目录 1引言 2摘要: 2关键词: 21. 设计模式概述 32.什么是设计模式: 33.为什么要用模式(模式到底能为我们做什么) 34.模式在开发中的重要性 35.设计模式遵循的几个原则 41)开闭原则 42)里氏代换原则 43)合成复用原则 4理解: 51. 52. 53. 54. 54)依赖倒转原则 65)接口隔离原则 66)抽象 原则 77)迪米特法则 76.模式大体框架分析 77.学习设计模式要具备的基本条件 81) 82) 83) 84) 88.设计模式原则的综合应用 8结束语: 11

引言从60年代末开始,由于计算机软件对生产力有巨大的推动作用,各种大型、复杂的软件系统相继被开发出来。然而,随着软件系统规模的扩大和复杂性的增加,软件开发需要越来越巨大的人力、物力,同时软件系统的可靠性和可维护性明显降低,软件业出现了危机。直到80年代,软件开发采用面向对象的开发语言,软件危机才在一定程度上得到缓解。面向对象开发方法的核心思想是将系统看成是对象及对象之间的相互关系的集合,思维方式更接近人们认识世界的规律,克服了面向过程开发存在的诸多弊端。但是采用面向对象的方法来开发软件,也需要一些正确的开发原则来指导,否则,开发的软件将不可避免的带有某些缺陷,如系统过于僵硬,不能很好的适应需求变化;系统过于脆弱,往往修改一处代码会带来无法预测的后果;系统复用率低,黏度过高等。为了避免上述缺陷,设计具备良好的可扩展性、可复用性、易维护性的系统,在系统设计和实践阶段我们应采用设计模式的思想。摘要:设计模式是面向对象的软件设计与实现的关键技术。较好的理解设计模式以及建立良好的设计模式是应用设计模式的前提。此文章主要讲解了什么是设计模式,设计模式的分类,同时也介绍了建立良好的设计模式应满足的一般原则。关键词:面向对象设计模式软件复用

设计模式概述在计算机科学中,对设计模式的简单定义就是对于一类重复出现的问题的一种可重用的解决方案,在软件工程中一个设计模式往往能解决一类软件设计问题。设计模式的使用帮助设计人员更加简单、方便地改进或复用以往成功的设计和体系结构,采用设计模式的软件系统具有更好的可维护性。一般而言,一个模式有四个基本要素:1.模式名称(patternname):一个助记名,它用一两个词来描述模式的问题、解决方案和效果。2.问题(problem):描述了应该在何时使用模式。3.解决方案(solution):描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。效果(consequences):描述了模式应用的效果及使用模式应权衡的问题(一)概述2.什么是设计模式:设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码实际经验的总结3.为什么要用模式(模式到底能为我们做什么)1、一个系统需求做的再好,分析再认真,没有好的设计也是不行的,因此,我建议大家关注DESIGNPATTERN,这是大家全面进步的一个机会,也是走向务实的道路。2、复用考虑,某些模式可以增强被包装类的复用能力3、有效的处理需求的变更,做到以不变应万变4、设计模式可以减少各个分析类之间的耦合和倚赖。5、最有效的学习别人经验的方法6、可以使你的设计象专家做出来的一样。7、带给你全新的设计思想。8、更好的理解别人的工作。如果你不懂模式,别人的工作你可能看不明白。9、使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性4.模式在开发中的重要性正如上面所说的设计模式的出现是为了解决项目开发中相同问题的不断出现的一个很好的解决方法的总结。它是项目维护升级时重要的基石。如果我们把项目比作成盖房子的话,设计模式就是一个一个方砖可拆可加可扩可收,设想下你的房子用泥去糊上的话显然属于一次性的产品,而其一旦出了问题。。。。(你敢住否)。一个项目特别这个项目是产品的话我们要尽可能的去做这些个设计,虽然我们付出了一些成本(方砖是由泥土烧化而成当然是需要成本的哈)但对这个项目来说呢多了稳健和可扩展性,大大降低了相同问题的维护量,程序员之间的交互更为模式化,何乐而不为呢,所以在项目中模式的运用是不可或缺的。5.设计模式遵循的几个原则1)开闭原则提出者:BertrandMeyer英文名:OCP(Open-ClosedPrinciple)内容:Softwareentitiesshouldbeopenforextension,butclosedformodification.(一个软件实体应当对扩展开发,对修改关闭)理解:模块应对扩展开放,对修改关闭。我们在重构代码时尽量在不修改原来代码的情况下进行扩展。优点:扩展已有系统提供新的行为。在扩展的同时对旧版本有很好的支持。使得系统更加灵活和很强的适应性。2)里氏代换原则提出者:BertrandLiskov英文名:LSP(LiskovSubstitutionPrinciple)内容:子类型(subtype)必须能够替换他们的基类型。(如果调用父类型的话,那么换成子类也可以完成)是继承复用的基础理解:在模块中应当尽量从抽象类中继承,而不是从具体的类中继承。里氏代换只能子类代换父类,反过来是决对不可以的。优点:衍生类可以替换掉基类,软件不受到影响。在扩展的同时对旧版本有很好的支持。软件代码复用的重要基础。3)合成复用原则英文名:CARP(CompositionAggregationReferencePrinciple) 合成和聚合都是关联的特殊种类,聚合表示整体和部分的关系,表示“拥有”;合成则是一种更强的“拥有”,部分和整体的生命周期是一样的,合成的新的对象完全支配其组成部分,包括他们的创建和湮灭。一个合成关系的成分对象是不能与另一个合成关系共享的内容:合成是值的聚合(AggregationbyValue),聚合是引用的聚合(AggregationbyReference)理解:1.聚合就是多个事物聚集在一起打个比方一个大型的商场有多个摊位(做生意的人都知道)每个摊位里摆放的商品集合起来吸引众多买家来购物就形成了繁华的商场,这里可以看出每个摊位的商品不属于商场,商场关门了这些商品可以拿到其他商场中去卖所以商品和商场的关系就是聚合关系;回过头来我们看下摊位和商场的关系,摊位是随着商场的建立而孕育而生的(商场就靠这个来赚钱呢)商场没有了摊位也随之消失所以摊位和商场的关系就是一种合成关系摊位伴随着商城的建立和湮灭他们的生命周期是一样的。2.一个合成关系的成分对象是不能与另一个合成关系共享的。我们怎么去理解呢。2个商场中央商场和大洋百货,两个商场是独立的没有隶属关系(偶在南京),中央商场的摊位和大洋百货是不可能有任何隶属关系的我们不可以说中央商场的摊位是属于大洋百货的(你这话说出来估计有人要。。。。)很好理解吧你直接可以理解为私有财产3.我们在开发中尽量使用合成/聚合,而不是使用继承。在OOD中有两种基本的办法实现服用1.通过合成、聚合优点:(1).黑箱复用,因为成分对象的内部实现细节新的对象是看不见的。(2)支持包装。(3).复用所需的依赖较少。(这个就是我为什么首选合成聚合而不用继承的主要原因)(4)新类可以把焦点集中在一个任务上,不去关心类成分间的复杂关系(5):复用是可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象(6):新对象存取成分对象的唯一方法是通过成分对象的接口(这个也埋下一个缺点)缺点:(1)系统中会有很对对象需要管理。4.继承(很多程序员在初始理解设计模式时复用就是继承这个是错误的,我们在设计模式时优先选择前种,继承我个人理解成合成聚合实现不了时我会用继承)优点:新类实现比较容易修改和扩展继承而来的实现比较容易缺点:继承复用破坏了包装,因为继承讲超类的实现细节暴露给了子类,这种复用是透明的复用,又称“白箱”复用如果超类发生改变,那么子类的实现不得不发生改变从超类继承来的实现是静态的,不可能在运行时间内发生改变,没有足够的灵活性继承只能在有限的环境中使用何时用继承:子类是超类的一个特殊种类。而不是超类的一个角色,区分“Has-A”和“Is-A”。只有“Is-A”(…是…)关系才符合继承关系,“Has-A”(…有…)关系应当用聚合来描述补充:错误的理解“Has-A”和“Is-A”真确理解“Has-A”和“Is-A”永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定就不要用继承子类扩展了超类的责任,而不是具有换调(override)或注销掉(Nulify)超类的责任。如果子类需要大量的置换草类的行为,那么这个类就不因该是超类的子类4)依赖倒转原则英文名:DIP(DependenceInversionPrinciple)内容:抽象不应该依赖与细节,细节应当依赖与抽象;要针对接口编程,不要针对实现编程;传递参数,或者在组合聚合关系中,尽量引用层次高的类;理解:程序在需要引用一个对象时,应当尽可能的使用抽象类型作为变量的静态方法,这个就是针对接口编程的含义。是达到“开-闭”原则的途径。针对接口编程和抽象类就是要做到一个具体的类应当只实现类的几口和抽象类中声明的方法,而没有多余的方法。做到DIP关键是抽象耦合,LSP是DIP的基础5)接口隔离原则英文名:ISP(InterfaceSegregationPrinciple)内容:使用多个专门的接口比使用单一接口要好,过于臃肿的接口是对就口的污染。理解:一个类对另一个类的依赖性应当是建立在最小的接口上。不应该强迫客户依赖于他们不用的方法。我们在OOD时恰当的划分角色和角色对应的接口是非常重要的。讲没有关系的接口合并在一期是对角色和接口的一种污染,如果把一些看上去差不多的几口合并成一个几口,貌似是对代码的优化,其实是错误的。原则要求我们在不同的角色要给不同的接口,而不能交给一个接口。向客户提供的接口就像你对客户提供的承诺,承诺越少越好(那些生产厂家天天就琢磨这个了,没想到吧)优点:系统可维护性高(我承诺的少当然维护性高了哇哈哈)6)抽象 原则英文名:AP(AbstractPrinciple)内容:抽象类不会有实例,一般作为父类被其他类继承,包含了子类的共同属性和方法理解:OOD是好的抽象类是尽可能多的包含共同代码,具体类是不被其他类所继承的。换句话说子类继承了抽象类后,这个子类不应被其他类所继承7)迪米特法则英文名:LoD(LawofDemeter)内容:又叫最少知识原则(LeastKnowledgePrincipleLKP)。一个对象应当对其他对象尽可能的少了解。理解:俗话说了解的越多,越烦恼这就体现出来了。每个人都听过妈妈的一句“不要跟陌生人说话”。这里的最少知道原则就是让每个类专心的做自己的事情而不去关心其他的事情这样的好处就是尽量的减少了耦合度。 优点:减少类见的耦合度6.模式大体框架分析我比较倾向与下面的分类方法,首先我们要去总结下设计模式到底分为哪几种类型每种类型到底使用来解决什么问题(这个会在每个模式讲解中一一体现)7.学习设计模式要具备的基本条件俗话说得好“欲练神功必先自宫,就算自宫未必成功。”这话听起来很有意思,也很搞恶,但它确确实实的反应出很现实的问题。“欲练神功必先子宫”先决条件,“就算子宫未必成功”这个就是结果的一种。不是你子宫了你就能练成绝世神功,也是需要看先天灵性和后天努力的。说了那么多废话,其实我想表达的意思很简单,设计模式很抽象进入的门槛也不是太高,但学完后能灵活运用的人不多。那么我们进入这个领域的先决条件有那些呢1)面向对象编程思想,知道抽象、继承、多态3个核心内容概念2)熟练使用.NET中的任意一种语言(以后所有示例都会用C#编写所以还是希望大家多了解点C#语言)要熟练使用接口、继承、多态、委托、事件等语言实现方法3)熟悉UML建模4)有一定的项目经验(我在看很多朋友在写关于设计模式的文章时都忽略了这点,从我个人成长的过程来看学习设计模式单单从理论上去学习不是什么好的方法,很容易让人思维定式,我们学习设计模式不是为了学而学,是为了用而学,学会怎样灵活的使用它,这个和个人项目经验有很大的关系)8.设计模式原则的综合应用下面以策略模式(Strategy)为例来介绍上述三条原则的综合应用。图一策略模式示例代码如下:classComposition{public:Composition(Compositor*){Icompositor=Compositor;}//仅作为举例使用,Traverse()}//逻辑代码,Repair(){Icompostitor->Compose();//使用组合对象Icompostitor来获得服务;}private:Compositor*Icompostitor;}classCompositor{public:Compositor();virtualintCompose()=0;//对外抽象逻辑接口,这里不能实现protected:Compositor();}classSimpleCompositor:publicCompositor{Compose(){……..}//具体算法实现}classTeXCompositor:publicCompositor{Compose(){………}//具体算法实现}classArrayCompositor:publicCompositor{Compose(){…….}//具体算法实现}客户端代码:(部分)Composition*test1=newComposition(newSimpleCompositor());//这儿可以按照客户的意愿替换Comp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论