高级软件工程之设计模式.ppt
《高级软件工程之设计模式.ppt》由会员分享,可在线阅读,更多相关《高级软件工程之设计模式.ppt(167页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、高级软件工程之设计模式从问题开始!从问题开始!n长方形与正方形n假如我们有一个类:长方形(Rectangle)n我们需要一个新的类,正方形(Square)n问:可否直接继承长方形?没问题,因为数学上正方形就是长方形的子类!没问题,因为数学上正方形就是长方形的子类!没问题,因为数学上正方形就是长方形的子类!没问题,因为数学上正方形就是长方形的子类!2违背违背Liskov替换原则替换原则SquareSquare类针对类针对类针对类针对heightheight、widthwidth添加了添加了添加了添加了RectangleRectangle所没有的附加的约束(即要求所没有的附加的约束(即要求所没有的
2、附加的约束(即要求所没有的附加的约束(即要求height=widthheight=width),这样),这样),这样),这样SquareSquare类(子类(子类(子类(子类)不能完全替换类)不能完全替换类)不能完全替换类)不能完全替换RectangleRectangle(父类)(父类)(父类)(父类)违背了违背了违背了违背了Liskov替换原则替换原则带来潜在的设计问题(使用带来潜在的设计问题(使用带来潜在的设计问题(使用带来潜在的设计问题(使用resizeresize方法方法方法方法时,子类出错!)时,子类出错!)时,子类出错!)时,子类出错!)6怎么办?怎么办?在可能的情况下,由抽象类(
3、接口)继承在可能的情况下,由抽象类(接口)继承在可能的情况下,由抽象类(接口)继承在可能的情况下,由抽象类(接口)继承7抽象类与具体类抽象类与具体类只要有可能,不要从具体类继承只要有可能,不要从具体类继承只要有可能,不要从具体类继承只要有可能,不要从具体类继承。行为集中的方向是向上的(抽象类)行为集中的方向是向上的(抽象类)行为集中的方向是向上的(抽象类)行为集中的方向是向上的(抽象类)数据集中的方向是向下的(具体类数据集中的方向是向下的(具体类数据集中的方向是向下的(具体类数据集中的方向是向下的(具体类)8解决方案解决方案9主要内容主要内容u软件设计模式导论u创建型模式u结构型模式u行为型模
4、式软件设计模式导论软件设计模式导论u软件设计模式概念u设计原则uGoF的设计模式uGoV的设计模式u反模式11模式模式模式在现实生活中随处可见,模式是对成功应用经验的总结与复用。人们在自己的环境中不断发现问题和找寻问题的解决方案人们在自己的环境中不断发现问题和找寻问题的解决方案的时候,发现的时候,发现有一些问题及其解决方案不断变换面孔重复有一些问题及其解决方案不断变换面孔重复出现,在这些不同的面孔后面是共同的本质;这些共同的出现,在这些不同的面孔后面是共同的本质;这些共同的本质就是本质就是模式。模式。如广东人的老火例汤:鲮鱼+?生鱼+?12模式模式13模式模式14无处不在的模式无处不在的模式好
5、莱坞电影模式动作片、戏剧片、战争片、灾难片、恐怖片古代行军布阵八卦阵、鸳鸯阵、天门阵建筑、服装、交通、文化.等领域诸多模式模式的起源模式的起源模式思想最初形成于建筑学。1977年,建筑大师年,建筑大师Alexander出出版了版了A Pattern Language:Towns,Building,Construction一书。该书描述了城镇、邻里、一书。该书描述了城镇、邻里、住宅、花园和房间等住宅、花园和房间等253种设计种设计建筑物的模式。建筑物的模式。模式理论大师模式理论大师Christopher Alexander给出的模式定义:模给出的模式定义:模式是某外在环境式是某外在环境(Cont
6、ext)下,对下,对特定问题特定问题(Problem)的惯用解决的惯用解决方案方案(Solution)。设计模式在软件设计行业中的起源可设计模式在软件设计行业中的起源可以追溯到以追溯到1987年。受年。受Alexander著著作的影响作的影响,Kent Beck和和Ward Cunningham在在1987年举行的一次年举行的一次面向对象的会议上发表了论文:面向对象的会议上发表了论文:在面向对象编程中使用模式在面向对象编程中使用模式。目前,被公认在设计模式领域最具影目前,被公认在设计模式领域最具影响力的著作是响力的著作是Erich Gamma、Richard Helm、Ralph Johnso
7、n和和John Vlissides在在1995年合作出版年合作出版的著作:的著作:Design Patterns:Elements of Reusable Object-Oriented Software设计模式设计模式设计模式设计模式(中译本(中译本设计模式:可复用的设计模式:可复用的面向对象软件的基本原理面向对象软件的基本原理 或或设计模式设计模式),该书被广大喜),该书被广大喜爱者昵称为爱者昵称为GOF(Gang of Four)“四人帮四人帮”之书,被认为之书,被认为是学习设计模式的必读著作,是学习设计模式的必读著作,GOF之书已经被公认为是设计模之书已经被公认为是设计模式领域的奠基之
8、作。式领域的奠基之作。18广义讲,软件设计模式是可解决一类软件问题并能重复使用的软件设计方案狭义讲,设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。是在类和对象的层次描述的可重复使用的软件设计问题的解决方案模式体现的是程序整体的构思,所以有时候它也会出现在分析或者是概要设计阶段 模式的核心思想是通过增加抽象层,把变化部分从那些不变部分里分离出来什么是软件设计模式什么是软件设计模式学习设计模式的重要性学习设计模式的重要性n学习设计模式不仅可以使我们使用好这些成功的模式,更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于我们更好地使用面向对象语言解决设计中的
9、问题。模式名称(Pattern Name)问题(Problem):描述应该在何时使用模式。解释了设计问题和问题存在的前因后果,可能还描述模式必须满足的先决条件解决方案(Solution):描述了设计的组成成分、相互关系及各自的职责和协作方式。模式就像一个模板,可应用于多种场合,所以解决方案并不描述一个具体的设计或实现,而是提供设计问题的抽象描述和解决问题所采用的元素组合(类和对象)效果(consequences):描述模式的应用效果及使用模式应权衡的问题模式的基本要素模式的基本要素模式的特点模式的特点模式可以解决实际问题n模式可以解决具体问题,而不只是抽象的原则或策略模式是经过考验的概念n模式
10、有实际解决问题的记录,而不只是理论上的思索或推导模式中的解决方案不是显而易见的n某些求解技术根据原则直接推导出问题解,但模式间接的产生问题的解对复杂问题必须采用这种方法22u模式名和分类u意图:设计模式是做什么的?它的基本原理和意图是什么?它解决的是什么样的特定设计问题?u动机:说明一个设计问题以及如何用模式中的类、对象来解决该问题的特定情景u适用性:什么情况下可以使用该设计模式?该模式可用来改进哪些不良设计?如何识别这些情况?u结构:采用对象建模技术对模式中的类进行图形描述如何描述设计模式如何描述设计模式u参与者:指设计模式中的类 和/或 对象以及它们各自的职责u协作:模式的参与者如何协作以
11、实现其职责u效果:模式如何支持其目标?使用模式的效果和所需做的权衡取舍?系统结构的哪些方面可以独立改变?u实现:实现模式时需了解的一些提示、技术要点及应避免的缺陷,以及是否存在某些特定于实现语言的问题u代码示例:用来说明怎样实现该模式的代码片段u相关模式:与这个模式紧密相关的模式有哪些?其不同之处是什么?这个模式应与哪些其他模式一起使用?描述设计模式(续)描述设计模式(续)设计模式相关术语设计模式相关术语n设计模式与模式n设计模式与设计原则n设计模式与应用框架n设计模式与软件体系结构n设计模式与习惯用法25设计模式与模式设计模式与模式n模式的含义更广,可用于任意的背景中。n设计模式是一种模式n
12、除设计模式外,在软件领域还有其他模式n分析模式n组织模式n过程模式n领域模式n设计模式是关于面向对象设计微结构的模式n这种微结构又称对象结构n微结构指对象及其类之间的静态或动态关系26设计模式与设计原则设计模式与设计原则n设计原则是面向对象设计的指导思想n设计模式只是更好的遵循这些指导思想的手段之一n设计模式是面向对象设计的具体技术n设计模式抽象出成功设计的共性,并进行分类与标识n设计模式通过描述对象、协作和责任将设计中的意图抽取出来27设计模式与应用框架设计模式与应用框架n应用框架是可复用的半完整基础设施应用框架是可复用的半完整基础设施n应用框架可特化,以产生用户所需的应用系统。n应用框架是
13、领域分析复用的有效途径。n典型的应用框架:nJavaJava平台上平台上-GUI-GUI的的SwingSwing、持久性的、持久性的JDBCJDBC、多线程类库等。、多线程类库等。n分布式应用分布式应用-CORBA-CORBA的各种对象服务、公共设施与领域接口。的各种对象服务、公共设施与领域接口。n工作流应用工作流应用Workflow Management Coalition(WfMC)Workflow Management Coalition(WfMC)的规范的规范。n每一个应用框架都有一个具体的体系结构每一个应用框架都有一个具体的体系结构n设计模式则是抽象的,只有设计模式的例子才表达为具体
14、代码设计模式则是抽象的,只有设计模式的例子才表达为具体代码n应用框架可预先编写好,设计模式则每次使用时都需要重新实现。应用框架可预先编写好,设计模式则每次使用时都需要重新实现。n应用框架的设计通常在微体系结构层次采用了设计模式应用框架的设计通常在微体系结构层次采用了设计模式n设计模式描述的是软件的微体系结构设计模式描述的是软件的微体系结构n采用合适的设计模式可为专用应用框架提供良好的灵活性。采用合适的设计模式可为专用应用框架提供良好的灵活性。n应用框架通常特定于某一应用领域应用框架通常特定于某一应用领域28设计模式与软件体系结构设计模式与软件体系结构n软件体系结构所研究的对象粒度更大n软件体系
15、结构可以是为单个应用设计n设计模式通常是为了多个软件产品的生产线而设计n某些专家也将软件体系结构看作抽象层次更高的模式29设计模式与习惯用法设计模式与习惯用法n习惯用法所讨论的对象粒度更小n习惯用法通常是与特定的程序设计语言有关n设计模式通常只与特定的程序设计方法有关n某些专家也将习惯用法看作抽象层次更低的模式nGoV将模式划分为体系结构模式、设计模式与习惯用法3个层次30面向对象设计原则面向对象设计原则n软件的可维护性和可复用性n知名软件大师Robert C.Martin认为一个可维护性较低的软件设计,通常由于如下四个原因造成:n过于僵硬(Rigidity)n过于脆弱(Fragility)n
16、复用率低(Immobility)n黏度过高(Viscosity)Robert C.Martin31面向对象设计原则面向对象设计原则32面向对象设计原则面向对象设计原则n软件的可维护性和可复用性n软件工程和建模大师Peter Coad认为,一个好的系统设计应该具备如下三个性质:n可扩展性(Extensibility)n灵活性(Flexibility)n可插入性(Pluggability)Peter Coad33面向对象设计原则面向对象设计原则n面向对象设计原则和设计模式也是对系统进行合理重构的指南针.n重构(Refactoring)是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、
17、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。Martin Fowler34面向对象设计原则面向对象设计原则u开-闭原则(Open-Closed Principle,OCP)u里氏代换原则(Liskov Substitution Principle,LSP)u依赖倒置原则(Dependence Inversion Principle,DIP)u接口隔离原则(Interface Segregation Principle,ISP)u单一职责原则(Single Responsibility Principle,SRP)u合成复用原则(Composite Reuse Princi
18、ple,CRP)u迪米特法则(Law of Demeter,LoD)35面向对象设计原则面向对象设计原则设计原则名称设计原则名称设计原则简介设计原则简介重要性重要性单一职责原则单一职责原则(Single Responsibility Principle,SRP)类的职责要单一,不能将太多的职责放在一个类中。类的职责要单一,不能将太多的职责放在一个类中。开闭原则开闭原则(Open-Closed Principle,OCP)软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能。件实体的基础上去扩展其功能。里氏
19、代换原则里氏代换原则(Liskov Substitution Principle,LSP)在软件系统中,一个可以接受基类对象的地方必然可以接受一个子在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。类对象。依赖倒转原则依赖倒转原则(Dependency Inversion Principle,DIP)要针对抽象层编程,而不要针对具体类编程。要针对抽象层编程,而不要针对具体类编程。接口隔离原则接口隔离原则(Interface Segregation Principle,ISP)使用多个专门的接口来取代一个统一的接口。使用多个专门的接口来取代一个统一的接口。合成复用原则合成复用原则
20、(Composite Reuse Principle,CRP)在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系。使用继承关系。迪米特法则迪米特法则(Law of Demeter,LoD)一个软件实体对其他实体的引用越少越好,或者说如果两个类不必一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互。而是通过引入一个第三者发生间接交互。36类设计:开放类设计:开放-封闭原则
21、封闭原则(OCP)37开放开放-封闭原则封闭原则(OCP)n开闭原则由Bertrand Meyer于1988年提出,它是面向对象设计中最重要的原则之一。n在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。38Bertrand Meyer提出的软件构造原则提出的软件构造原则39u定义:软件对扩展是开放的,对修改是关闭的。开发一个软件时,应可以对其进行功能扩展(开放),在进行扩展的时候,不需要对原来的程序进行修改(关闭)。u在设计一个模块的时候,应当使这个模块可以在不被修改的在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代
22、码的情况下改变这个模前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。块的行为。u好处:在软件可用性上非常灵活。可以在软件完成后对软件进行扩展,加入新的功能。这样,软件就可通过不断的增加新模块满足不断变化的新需求u由于不修改软件原来的模块,不用担心软件的稳定性类设计:开放类设计:开放-封闭原则封闭原则(OCP)u实现的主要原则u抽象原则:把系统的所有可能的行为抽象成一个底层;由于可从抽象层导出一个或多个具体类来改变系统行为,因此对于可变部分,系统设计对扩展是开放的u可变性封装原则:对系统所有可能发生变化的部分进行评估和分类,每一个可变的因素都单独进行封装类设计:开放类设计:开放-封
23、闭原则封闭原则(OCP)类设计:开放类设计:开放-封闭原则封闭原则(OCP)n抽象化是开闭原则的关键。n绝大部分的设计模式都符合开闭原则,在对每一个模式进行优缺点评价时都会以开闭原则作为一个重要的评价依据,以判断基于该模式设计的系统是否具备良好的灵活性和可扩展性。n遵循原则的具体技术n运行时多态性:实现表示的独立性n单点选择原则是指导其应用的核心思想n编译时多态性:类属机制42n计算系统的原始设计方案如图所示:开放开放-封闭原则封闭原则(OCP)实例)实例现对该系统进行重构,使之满足开闭原则的要求。上图:客户端的一个方法直接调用加法类,若要添加一个减法类,则会发现添加减法类就得改变加法类中代码
24、(用switch语句实现),这就违背了“开闭原则”。下图:添加了一个运算类的父类,这样若再添加减法类的时候就不用修改客户端类。43n某图形界面系统提供了各种不同形状的按钮,客户端代码可针对这些按钮进行编程,用户可能会改变需求要求使用不同的按钮,原始设计方案如图所示:开放开放-封闭原则封闭原则(OCP)实例)实例44n现对该系统进行重构,使之满足开闭原则的要求。开放开放-封闭原则封闭原则(OCP)实例)实例45OCP的关键在于抽象的关键在于抽象nOCP的关键在于抽象n抽象技术:abstract class,Interfacen抽象预见了可能的所有扩展(闭)n由抽象可以随时导出新的类(开)46封闭
25、原则封闭原则(OCP)实例)实例:手与门:手与门n如何在程序中模拟用手去开门和关门?n行为:n开门(open)n关门(close)n判断门的状态(isOpened)47设计实现设计实现public class Door public class Door private boolean _isOpen=false;private boolean _isOpen=false;public boolean isOpen()public boolean isOpen()return _isOpen;return _isOpen;public void open()public void open()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 软件工程 设计 模式
限制150内