UML设计模式考试题

合集下载

uml试题及答案(考试专用)

uml试题及答案(考试专用)

一、名词解释:用例:是外部可见的系统单元,这些功能由系统单元所提供,并通过一系列系统单元与一个或多个参与者之间交换的消息所表达。

泳道:在活动图中,泳道用垂直实线绘出,垂直线分隔的区域就是泳道;组件:组件是定义了良好接口的物理实现单元,是系统中可替换的物理部件.双向工程:双向工程包括正向工程和逆向工程.正向工程就是从模型到代码,而逆向工程则是从代码到模型.正向和逆向工程结合在一起叫双向工程。

对象流:对象流是动作状态或者活动状态与对象之间的依赖关系,表示动作使用对象或者动作对对象的影响。

二、填空题1、UML中的模型元素包括事物和事物之间的联系。

2、Rational Rose包括了统一建模语言、面向对象的软件工程及对象建模技术。

3、时序图包含的4个元素有对象、生命线、消息、激活 .4、协作图以对象图的方式绘制各个参与对象,并且将消息和链平行放置。

5、组件是定义了良好接口的物理实现单元,是系统中可替换的物理部件.6、状态机包含了一个类的对象在其生命期间所有状态的序列以及对象对接收到的事件所产生的反应。

7、包图建模技术包括对成组的元素建模和对体系结构视图建模。

8、内部转换只有一个原状态但是没有目标状态 ,因此转换后并不改变状态本身。

9、分叉可以用来描述并发线程,每个分叉可以有一个输入转换和两个或多个输出转换.10、配置图描述了系统执行处理过程中系统资源元素的配置情况以及软件到这些资源元素的映射.三、1。

简述时序图的建模步骤。

如何识别用例?答:建模步骤:1)设置交互语境;2)确定对象;3)分析消息和条件;4)分析附加约束;5)对建模结果精化和细化2。

Rational Rose中有哪几种视图,各个视图的作用是什么?答:Rational Rose有四种视图:①用例视图:用例视图是被称为参与者的外部用户所能观察到的系统功能的模型图。

用例是系统中的一个功能单元,可以被描述为参与者与系统之间的一次交互作用。

用例模型的用途是列出系统中的用例和参与者,并显示哪个参与者参与了哪个用例的执行. 用例视图是其他视图的核心,它的内容直接驱动其他视图的开发。

uml参考题(带答案版)

uml参考题(带答案版)

uml参考题(带答案版)1、⾯向对象的核⼼要素:对象,封装,消息,类,抽象,继承,多态性(7个)2、封装把类构成那两个部分,⼜提供了哪两种保护两个部分:接⼝部分,和实现部分两种保护:1,对象内部的状态被保护起来,不会被与该对象沟通的对象直接篡改;2另⼀⽅⾯,对象内部特征的变化不会改变其他对象与该对象的沟通⽅式。

(另⼀种⽼师课件的答案:两种保护:1.⾸先保护对象,防⽌⽤户直接存取对象的内部细节;。

2.其次封装也保护了客户端,防⽌对象实现部分的变化可能产⽣的副作⽤,即实现部分的改变影响到客户端的改变。

)3、消息提供了服务的哪四个⽅⾯对象标识,服务(⽅法)标识,输⼊信息和回答信息等5、下⾯是⼀个⽤例描述的⽚断:Use Case: Withdraw Cash(提取现⾦)参与者:Customer主事件流:1. 储户插⼊ATM卡,并键⼊密码。

2. 储户按“Withdrawal”按钮,并键⼊取款数⽬。

3. 储户取⾛现⾦、ATM卡并拿⾛收据。

4. 储户离开。

上述描述中存在的问题:只描述了参与者的动作序列,没有描述系统的⾏为。

改进的描述:答:1. 通过读卡机,储户插⼊ATM卡。

2. ATM系统从卡上读取银⾏ID、帐号、加密密码、并⽤主银⾏系统验证银⾏ID和帐号。

3. 储户键⼊密码,ATM系统根据上⾯读出的卡上加密密码,对密码进⾏验证。

4. 储户按“FASTCASH”按钮,并键⼊取款数量,取款数量应该是5美元的倍数。

5. ATM系统通知主银⾏系统,传递储户帐号和取款数量,并接收返回的确认信息和储户帐户余额。

6. ATM系统输出现⾦,ATM卡和显⽰帐户余额的收据。

7. ATM系统记录事务到⽇志⽂件。

7、什么是场景,⼀个⽤例可以有多少个主要场景和次要场景?场景:是使⽤系统的⼀个特定情节或通过⽤例的⼀个特定执⾏路径。

每个⽤例有且只有⼀个主要场景可以有多个次要场景8、按照耦合度从⾼到低,说明类之间的关系有哪些?由强到弱:继承,组合,聚合,关联,依赖9、标准类图中成员四个可见性分别⽤什么表⽰?Public + Protected # Package ~Private -10、association aggregation generalization dependency 分别代表什么关系关联关系聚合关系泛化关系依赖关系11、给出下⾯带关联类类图的另⼀种普通类图表⽰。

UML建模期末考试题及答案

UML建模期末考试题及答案

UML建模期末考试题及答案一、单项选择题(每题2分,共20分)1. UML中用于表示系统的静态结构的图是:A. 活动图B. 用例图C. 类图D. 状态图答案:C2. 在UML中,一个类可以拥有的属性和方法的集合被称为:A. 接口B. 实现C. 封装D. 抽象答案:C3. 以下哪个不是UML中的关系?A. 关联B. 依赖C. 泛化D. 映射答案:D4. 以下哪个不是UML中的行为图?A. 活动图B. 序列图C. 状态图D. 部署图答案:D5. 在UML中,表示对象之间交互的图是:A. 用例图B. 类图C. 序列图D. 组件图答案:C6. 在UML中,一个对象的生命周期可以用以下哪个图来表示?A. 活动图B. 序列图C. 状态图D. 部署图答案:C7. 在UML中,表示系统的物理架构的图是:A. 用例图B. 部署图C. 组件图D. 包图答案:B8. 以下哪个是UML中的对象?A. 类B. 接口C. 实例D. 以上都是答案:C9. 在UML中,表示一个类可以实例化多少次的关系是:B. 泛化C. 聚合D. 组合答案:D10. 在UML中,表示对象之间交互的顺序的图是:A. 活动图B. 序列图C. 状态图D. 用例图答案:B二、多项选择题(每题3分,共15分)1. UML中,以下哪些图可以用来描述系统的动态行为?A. 活动图B. 序列图C. 状态图D. 用例图答案:A、B、C2. 在UML中,以下哪些元素可以表示类之间的关系?A. 关联B. 依赖C. 泛化D. 组合答案:A、B、C、D3. 以下哪些图可以用来描述系统的静态结构?A. 类图B. 对象图D. 部署图答案:A、B、C、D4. 在UML中,以下哪些图可以用来描述系统的交互?A. 序列图B. 通信图C. 用例图D. 活动图答案:A、B5. 在UML中,以下哪些元素可以表示对象之间的交互?A. 消息B. 信号C. 事件D. 操作答案:A、B、C三、简答题(每题10分,共30分)1. 请简述UML中用例图的作用。

UML考试题及答案

UML考试题及答案

UML考试题及答案UML 统⼀建模⼀、选择题 (共40分,每⼩题2分)1、下⾯的模型图中,哪个能正确表⽰“1个教师可以指导0个到多个学⽣的论⽂,1个学⽣必须有1个教师指导其论⽂” 的意思(C )2、计算机由CUP 、内存、硬盘、显⽰器、⿏标等构成,那么计算机类和⿏标类之间的关系是( C )A 继承关系B 关联关系C 聚合关系D 依赖关系 3、下⾯( B )图形表⽰依赖关系。

4、关于UML ,下⾯说法正确的是( D )A UML 是⼀种⾯向对象的建模⽅法。

B UML 是⼀种形式化的语⾔,使⽤UML 建⽴的模型可被计算机编译执⾏。

C UML 是⼀种⾯向对象的编程语⾔。

D UML 是⼀种⾯向对象的建模语⾔,但不是建模⽅法。

ABCD5、顺序图和交互图的关系,类似与下⾯的哪种关系(C )A 类和对象的关系B 类和参与者关系C Java和编程语⾔的关系D UML和Java的关系6、要对⼀个企业的⼯作流程建模,下⾯4种图中的(B )是最重要的。

A 交互图B 活动图C 状态图D 类图7、关于参与者,错误的说法是(C )A 参与者是与所建⽴的系统交互的⼈或物。

B 参与者可以是实际的⼈,也可以其他系统。

C 参与者是系统的⼀部分,是⽤例图的重要组成部分。

D 参与者之间可以存在泛化关系。

8、UML中关联的多重性是指(B )A ⼀个类有多个⽅法被另⼀个类调⽤。

B ⼀个类的实例对象能够与另⼀个类的多少个实例对象相关联。

C ⼀个类的某个⽅法被另⼀个类调⽤的次数。

D 两个类所具有的相同的⽅法和属性。

9、关于类图的说法正确的是(A )A 类图分为3个层次:对象层、特征层和关系层,其中对象层给出系统中所有反映问题域和系统责任的对象。

B 类图分为3个层次:对象层、特征层和关系层,其中特征层给出系统中所有反映问题域和系统责任的对象。

C 类图只是⼀种辅助模型,不如其他图重要。

D 类图定义了系统的功能需求,描述了系统的动态⾏为。

10、根据Coad/Yourdon的定义,⾯向对象的概念不包括(D )A 对象B 继承C 消息D 封装11、使⽤UML对系统进⾏动态建模,不能使⽤以下哪种图(A )A 类图B 顺序图C 状态图D 活动图12、UML 的结构事物不包括( D )A 接⼝B 类C 协作D 状态机 13、分析下⾯的顺序图,并指出哪种说法是正确的( C )A “求战”、“怎么办”以及“⽕烧连营”这3条消息并没有严格的次序,⽐如:“求战”消息有可能在“⽕烧连营”之前产⽣。

UML试题及答案

UML试题及答案

一、单项选择题: (本大题共 20 小题,每题 1 分,共 20 分)1. UML 的全称是 Unified Modeling Language(A) Unify Modeling Language (B) Unified Modeling Language(C) Unified Modem Language (D) Unified Making Language2. 执行者(Actor)与用例之间的关系是( C )(A)包含关系 (B)泛化关系 (C)关联关系 (D)扩展关系3. 在类图中,下面哪个符号表示继承关系( C )(A) (B) (C) (D)4. 在类图中,“ #”表示的可见性是( B )(A) Public (B) Protected (C) Private (D) Package5. 在类图中,下面哪个符号表示接口( C )(A) (B) (C) (D)6. 下面哪个视图属于 UML 语言的交互图( D )(A) 行为图 (B) 状态图 (C) 实现图 (D) 顺序图7. UML 语言包含几大类图形( B )(A) 3 (B) 5 (C) 7 (D) 98. OMT 方法是由下面哪位科学家提出的( b )(A) Booch (B) Rumbaugh (C) Coad (D) Jacobson9. 下面那个类图的表示是错误的( D )(A) (B) (C) (D)Student Student Student Studentname : String Name : StringgetName ()age: Integer getAge () Age:IntegergetName ()getAge ()10. 什么概念被认为是第二代面向对象技术的标志( A )(A)用例 (B) UML 语言 (C)活动图 (D) 组件图11. 下面哪个符号代表包图( A )(A) (B) (C) (D)12. 生命线是 UML 视图中哪个图形的组成部分( D )(A)类图 (B) 状态图 (C) 活动图 (D) 顺序图13. 在 UML 的顺序图中,通常由左向右分层排列各个对象,正确的排列方法是( a)(A) 执行者角色控制类用户接口业务层(B) 执行者角色用户接口控制类业务层后台数据库后台数据库(C) 执行者角色控制类用户接口后台数据库业务层(D) 执行者角色用户接口业务层控制类后台数据库14. 多对象是 UML 哪个视图中的概念( C )(A)类图 (B) 状态图 (C) 协作图 (D) 组件图15. 在类图中,哪种关系表达总体与局部的关系( D )(A)泛化 (B)实现 (C)依赖 (D)聚合16. 在 UML 中,接口有几种表达方式( A )(A) 2 (B) 4 (C) 6 (D) 817. 下面哪个图形代表活动( D )(A) (B) (C) (D)18. 下面哪个 UML 视图是描述一个对象的生命周期的( B )(A)类图 (B) 状态图 (C) 协作图 (D)顺序19. 顺序图由类角色,生命线,激活期和(B)组成(A)关系 (B)消息 (C)用例 (D) 实体20. UML 中关联的多重度是指 ( b)(A)一个类有多个方法被另一个类调用(B)一个类的实类能够与另一个类的多个实类相关联(C)一个类的某个方法被另一个类调用的次数(D)两个类所具有的相同的方法和属性二、多项项选择题: (本大题共 10 小题,每题 2 分,共 20 分) 在每小题列出的五个备选项中有二个至五个是符合题目要求的,请将其代码填写在题后的括号内。

UML必考45道选择题

UML必考45道选择题

UML课程题库一、选择题(共45个)1.用例图不包括以下哪方面的内容()A 参与者。

B 用例。

C 依赖、泛化和关联关系。

D 生命线2.面向对象的三个要素不包括以下哪个()A 封装 B继承 C 多态 D 接口3.UML图分为静态图和动态图,以下哪个属于静态图A 状态图 B协作图 C 类图 D 顺序图4.在UML建模时,应该最先画什么图()A 顺序图 B用例图 C 类图 D构造图5.类图的表示方法如下,其中B区应该是类的()A 方法 B名称 C 属性 D以上都不是6.下图中,表示()图或()图的开始和结束A 类图和对象图B 类图和部署图C 状态图和活动图 D顺序图和活动图7.“泳道”的概念出现在 ( ) 图中A活动图 B状态图 C顺序图 D协作图8.UML图不包括 ()(A)用例图(B)类图(C)状态图(D)流程图9.在类图中,下面哪个符号表示继承关系()10.在类图中,下面那种不是类属性的可见性()(A)Public (B)Protected (C)Private (D)Package11.类之间的关系不包括()(A)依赖关系(B)泛化关系(C)实现关系(D)分解关系12.在UML中,协作图的组成不包括()(A)对象(B)消息(C)发送者(D)链13.下面哪个符号代表包图()14.顺序图由类角色,生命线,激活期和()组成(A)关系(B)消息(C)用例(D)实体15.UML中关联的多重度是指()(A)一个类有多个方法被另一个类调用(B)一个类的实体类能够与另一个类的多个实体类相关联(C)一个类的某个方法被另一个类调用的次数(D)两个类所具有的相同的方法和属性16.在()中每个参与者以及系统都用一条垂直的生命线表示,每条消息用从发送方指向接收方的水平箭头表示。

A、类图B、顺序图C、状态图D、活动图17.UML图明确地在关联线的两端列出了多重性,UML用区间来确定多重性,其中特殊符号“*”表示()A、零B、1C、多D、1或多18.UML有两种类型的部分-整体关系:()A、聚合和合成B、组合和合成C、聚合和组合D、聚合与关联19.下面哪些图形可以清楚地表达并发行为()(A)类图(B)状态体(C)活动图(D)顺序图20.UML提供了一系列的图支持面向对象的分析与设计,其中____(1) ___给出系统的静态设计视图;___(2) ___对系统的行为进行组织和建模是非常重要的;____(3) __和____(4) ___都是描述系统动态视图的交互图,其中___(5) __描述了以时间顺序组织的对象之间的交互活动,___(6) ___强调收发消息的对象的组织结构。

uml试题——精选推荐

uml试题——精选推荐

uml试题1.UML图不包括( D )A⽤例图B类图 C状态图D流程图2.下⾯哪⼀项不是包图中的关系( D )A<> B<> C<> D<>3.在类图中,下⾯哪个符号表⽰继承关系( C )4.在类图中,“ #”表⽰的可见性是( B )A PublicB ProtectedC PrivateD Package5.消息的组成不包括( C )A 接⼝B 活动C 发送者D 接收者6.下⾯哪个视图属于UML语⾔的交互图( D )A ⾏为图B 状态图C 实现图D 顺序图7.下⾯哪个不是UML中的静态视图( A )。

A.状态图B.⽤例图C.对象图D.类图8.对于⼀个在线旅⾏代理商使⽤的在线旅⾏公司系统,通过分析获得了下列⽤例及⽤例说明,其中哪⼀个应该不是合适的⽤例。

( D )A预定航班机票B预定酒店住宿C在线⽀付D开始实地旅⾏9.某游戏使⽤⾯向对象技术建模,游戏⾓⾊和道具分别是两个类,游戏⾓⾊达到⼀定条件后可以使⽤相应的道具。

游戏⾓⾊和道具之间的关系应该是(D )A、关联B、继承C、聚合D、依赖10.类之间的关系不包括( D )A 依赖关系B 泛化关系C 实现关系D 分解关系11.在UML中,协作图的组成不包括( C )A 对象B 消息C 发送者D 链12.下⾯哪个符号代表包图( A )BA C DBA C D13.下列对状态图描述不正确的是( C )A 状态图通过建⽴类对象的⽣命周期模型来描述对象随时间变化的动态⾏为B 状态图适⽤于描述状态和动作的顺序,不仅可以展现⼀个对象拥有的状态,还可与说明事件如何随着时间的推移来影响这些状态C 状态图的主要⽬的是描述对象创建和撤销的过程中资源的不同状态,有利于开发⼈员提⾼开发效率D 状态图描述了⼀个实体基于事件反应的动态⾏为,显⽰了该实体如何根据当前所处状态对不同的事件作出反应14.在UML的顺序图中,通常由左向右分层排列各个对象,正确的排列⽅法是( A)A 执⾏者⾓⾊控制类⽤户接⼝业务层后台数据库B 执⾏者⾓⾊⽤户接⼝控制类业务层后台数据库C 执⾏者⾓⾊控制类⽤户接⼝后台数据库业务层D 执⾏者⾓⾊⽤户接⼝业务层控制类后台数据库15.在UML中,接⼝有⼏种表达⽅式( A )A 2 B)4 C 6 D 816.下⾯哪个UML视图是描述⼀个对象的⽣命周期的( B )A 类图B 状态图C 协作图D 顺序17.顺序图由对象,⽣命线,控制焦点和(B)组成A 关系B 消息C ⽤例D 实体18.在⼀个“订单输⼊⼦系统”中,创建新订单和更新订单都需要检查⽤户帐号是否正确。

UML试题(内含答案)

UML试题(内含答案)

UML试题(内含答案)【用例图】1.用例图的节点包括(ABD)A、用例B、边界C、关联D、执行者2.用例之间的关系主要有(BCD)A、聚合B、继承C、扩展D、包含3.在采用用例模型捕获需求时,需要执行如下(ABCD)操作A、描述非功能需求B、用例建模C、识别用例D、识别参与者4.在识别用例时,以下(ABC)问题可以帮助识别用例A、当系统状态发生故障时,是否需要通知参与者B、系统是否存在外部事件,如果存在,是哪个能参与者通知系统这些个部事件C、参与者希望系统为他提供什么样的功能D、系统运行环境是什么5.在用例图中,可以用(D)来表示整个软件系统或其中一些子系统的边界,也可以用它表示软件系统的不同发布版本的功能范围A、执行者B、关联关系C、用例D、边界框6.(B)作为完成用例任务的责任承担者,协调、控制其他类共同完成用例规定的功能或行为A、数据对象B、控制类C、实体类D、边界类7.基于用例图的需求捕获的第一步就是确定系统的参与者,在寻找系统参与者时,可以根据以下(ABCD)等问题来确定A、系统同环境如何进行交互B、由谁安装系统C、系统为哪些对象提供信息、服务D、系统的使用者是谁8.如果用例B是用例A的某项子功能,并且建模者确切地知道在A所对应的动作序列中何时将调用B,则称(A)A、用例A扩展用例BB、用例A继承用例BC、用例A包括用例BD、用例A实现用例B9.如果用例A与用例B相似,但A的动作序列是通过改写B的部分或者扩展B的动作而获得的,则称(B)A、用例A实现用例BB、用例A继承用例BC、用例A扩展用例BD、用例A包括用例B10.如果用例A与用例B相似,但A的功能较B多,A的动作序列是通过在B的动作序列中的某些执行点上插入附加的动作序列而构成的,则称(C)A、用例A扩展用例BB、用例A包含用例BC、用例A继承用例BD、用例A实现用例B11.在UML中,(A)表示使用软件系统的功能,与软件系统交换信息的外部实体A、执行者B、类C、用例D、用例图12.在用例图中,执行者之间的关系只有(B)一种A、包含B、继承C、扩展D、实现【静态图】1.对于类,其属性的可见性表示对类的外部世界的可见性,它有以下(ABCD)选项A、公开(public)B、包内公开(package)C、保护(protected)D、私有(private)2.在UML中,以下(ABCD)是可以应用于包的构造型A、框架{《Framework》}B、虚包{《Facade》}C、子系统{《Subytem》}D、系统{《ytem》}3.两个类之间的关联表示他们之间存在一种不适于继承的逻辑关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UML设计模式考试题
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

该模式中包含的角色及其职责
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。

工厂类可以被外界直接调用,创建所需的产品对象。

抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色
简单工厂模式的特点:
简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

在这个模式中,工厂类是整个模式的关键所在。

它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。

用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。

有利于整个软件体系结构的优化。

请问什么是责任链器模式,责任链模式包含哪些角色、可以应用在哪些场景?定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

角色:处理者、具体处理者。

场景:有许多对象可以处理用户的请求,希望程序在运行期间自动确定处理用户的那个对象;希望用户不必明确指定接受者的情况下,向多个接受者一个提交请求;程序希望动态指定可处理用户请求的对象集合
设计模式六大原则-单一职责原则、开放封闭原则、依赖倒转原则、里氏代换原则、迪米特法则、合成/聚合复用原则
标签:扩展编程设计模式class测试工作
2012-07-31 09:26 1823人阅读评论(0) 收藏举报
分类:OO(1)
原则,故名思议则是本质的意思。

所谓擒贼先擒王,研究设计模式自然要先了解设计原则,所有的模式都是在这些原则的基础之上发展起来的,有的是侧重一个,有的是多个都有所涉及。

看完设计模式之后,我感觉到每个模式都有这些原则的影子,还渗透着面向对象的三大属性,也觉得这些原则也都有相通之处,,正是有了他们才使我们由代码工人转为艺术家。

下面我来点评一下六大原则,望各位拍砖:
1、单一职责原则(Single Responsibility Principle,简称SRP)
单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者一直这个类完成其他职责的能力。

这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破
坏。

而软件设计真正要做的许多内容,就是发现职责,并把这些职责相互分离。

一句话点评:高内聚低耦合的绝佳体现,不要乱拉关系,独善其身挺好。

2、开放--封闭原则(The Open-Closed Principle,简称OCP)
开放--封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。

即对于扩展是开放的,对于更改是封闭的。

我们不可能做到未卜先知,在设计的时候尽可能让一个类足够好,设计好了就不要去修改了;不能完全封闭的情况下,当发生变化时,我们就创建抽象来隔离以后发生的同类变化。

一句话点评:开放扩展,封闭更改,开合有度是一门艺术。

开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。

软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。

其他的设计原则,很多时候是为实现这一目标服务的,例如以Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。

关于开放封闭原则,其核心的思想是:
软件实体应该是可扩展,而不可修改的。

也就是说,对扩展是开放的,而对修改是封闭的。

因此,开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。

对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

“需求总是变化”、“世界上没有一个软件是不变的”,这些言论是对软件需求最经典的表白。

从中透射出一个关键的意思就是,对于软件设计者来说,必须在不需要对原有的系统进行修改的情况下,实现灵活的系统扩展。

而如何能做到这一点呢?
只有依赖于抽象。

实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。

让类依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。

这是实施开放封闭原则的基本思路,同时这种机制是建立在两个基本的设计原则的基础上,这就是Liskov替换原则和合成/聚合复用原则。

关于这两个原则,我们在本书的其他部分都有相应的论述,在应用反思部分将有深入的讨论。

对于违反这一原则的类,必须进行重构来改善,常用于实现的设计模式主要有Template Method模式和Strategy模式。

而封装变化,是实现这一原则的重要手段,将经常发生变化的状态封装为一个类。

3、依赖倒转原则(Dependence Inversion Principle )
依赖倒转原则,指高层模块不应该依赖低层模块,两个都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。

说白了就是要针对接口编程,不要对实现编程。

举个例子:计算机硬件中,如果内存坏了,那么只需要换一个内存条就可以了,而不需要去换一个主板,在这里内存是一个接口类,只要符合他的规格要求就行,无论是那一根。

一句话点评:搞建筑时要做设计师,而不是砖瓦工,抽象的蓝图要靠具体的材料一点点实现。

抽象不应该依赖于细节,细节应当依赖于抽象。

要针对接口编程,而不是针对实现编程。

传递参数,或者在组合聚合关系中,尽量引用层次高的类。

主要是在构造对象时可以动态的创建各种具体对象,当然如果一些具体类比较稳定,就不必再弄一个抽象类做它的父类,这样有画蛇添足的感觉。

优点:
系统扩展灵活。

缺点:
需要大量的类。

4、里氏代换原则(Liskov Substitution Principle,简称LSP)
里氏代换原则,子类型必须能够替换掉他们的父类型。

在软件里面,把父类都替换成其子类,程序的行为不会发生变化。

正是由于子类型的可替换性才使得使用父类型的模块在无需修改的情况下就可以扩展。

一句话点评:长辈给了你继承的权利就一定要做赡养的义务,把长辈的职责都要承担起来。

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。

里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

里氏代换原则是对“开-闭”原则的补充。

实现“开-闭”原则的关键步骤就是抽象化。

而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

5、迪米特法则(Law of Demeter)
迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。

如果其中一个类需要调用另一个类的某一个方法时,可以通过第三者转发这个调用。

类之间的耦合越弱,就越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。

主要是强调了类之间的松耦合。

6、合成/聚合复用原则(Composition/Aggregation Principle],简称CARP)
合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承。

合成聚合是“has a”的关系,而继承是“is a”的关系。

由于继承是一中强耦合的结构,父类变,子类必变。

所以不是“is a”关系,我们一般不要用继承。

优先使用合成聚合复用原则,有助于保持每个类的封装,降低继承的层次。

一句话点评:优生优育,不要盲目繁衍。

public class FlyweightFactory{
private HashMap flyweights = new HashMap();
public Flyweight getFlyweight(String key){
if(flyweights.containsKey(key)){
return (Flyweight)flyweights.get(key);
}
else{
Flyweight fw = new ConcreteFlyweight();
flyweights.put(key,fw);
return fw;
}
}
}。

相关文档
最新文档