杨大川设计模式讲义04_2

合集下载

跟我学软件系统设计中所涉及的GOF设计模式和J2EE核心设计模式

跟我学软件系统设计中所涉及的GOF设计模式和J2EE核心设计模式

1.1跟我学软件系统设计中所涉及的GOF设计模式和J2EE核心设计模式在本单元中希望重点了解和掌握软件体系架构,层体系架构模式,设计模式,对设计模式的几点感悟,J2EE“蓝图”中所给定的各种核心设计模式。

1.1.1设计模式的产生1、软件需要设计吗过去软件设计经常遇到这样的事情,由于初期分析和设计做得不够,只有一个大概的框架就开始编程了。

当软件投运以后,用户提出各种各样的修改意见,有的是可以修改的,但有的是无法修改的,或者大面积的返工。

最后只有两种可能,一个是软件不满意的“委屈”的运行,另一个就是被弃之不用,这种情况在国内是非常普遍的。

这一系列的困惑,迫使人们越来越关注软件系统设计本身的问题。

人们往往会问,软件的优化,或者设计方向有原则吗?2、质量可以客观评价吗多年前,有一个叫Christopher Alexander(克里斯多弗. 亚历山大)的建筑师自问:“质量可以客观评价吗?你认为美的东西,对所有观看者都是美的吗?”比如,你设计了一个房子的入口,有什么理由认为这个这个入口的位置就是美的呢?Alexander认为,建筑学系统确实存在这样一种客观规则,他认为评价一个建筑是否美观,并不仅仅是观察者品味问题,我们可以构造一个评价系统,客观评价它的美学问题。

问题的核心是:只要把注意力关注在解决同样问题的不同解决方案,以缩小自己的关注点,从而找到优质设计的相似点,而这些相似之处称之为“模式”。

Alexander的研究,为建筑学的尤其是建筑美学的理论化,打开了一扇门。

3、软件业的设计模式到上个世纪90年代,一群优秀的开发者偶尔发现了Alexander关于“设计模式”的研究成果,他们发现,建筑学中的“设计模式”理论也同样适合软件设计。

因为,软件设计中同样存在不断重复出现,可以用某种相同方式解决的问题。

也可以按照某种模式进行识别,并且可以在这个模式的基础上创建特定的解决方案。

如果这个假想是成立的,那么软件行业就可以建立自己的设计模式,并以此在企业级开发中设计出更加优秀的系统来,研究表明,这个设想是成立的。

《设计思维与方法》课程教学大纲.docx

《设计思维与方法》课程教学大纲.docx

《设计思维与方法》课程教学大纲课程名称:设计思维与方法课程代码:10135281课程类型:专业必修课学分:2.5 总学时:48 理论学时:32 实验(上机)学时:16先修课程:字体设计、图形设计、广告设计等适用专业:艺术设计视觉传达一、课程性质、目的和任务《设计思维与方法》是艺术设计专业的专业限选课。

本课程主要讲授设计思维的理论及思维方法。

通过学习该课程,培养学生对设计思维与方法有一个比较全面地认识,掌握现代设计的思维方式及表现方法,为后续专业课程的学习提供理论基础。

从设计创意、设计方法和设计展望三个角度出发,讲述设计全过程应注意的方法和思维方式:(1)分别讲述设计的理论基础、创造性思维方法与训练、系统设计思想及方法等内容。

(2)并将设计理论与方法结合于设计过程,以系统的观点出发,从风格和市场等角度说明如何为设计定位。

(3)从感性和理性两个角度进行设计构思。

(4)设计表达与沟通。

(5)发展中的艺术设。

(6)设计和人的关。

二、教学基本要求1、知识、能力、素质的基本要求:本门课不仅注重艺术水平和实际操作性,还结合现状,具有一定的系统性和前瞻性;不仅重视基本功训练和专业基础教学,还注重理论修养的提高和设计思维的创新。

基础与专业创新并重,理论与实践相结合,艺术性与科学性兼顾是艺术设计专业人才培养的要求,也是这套系列教材的特色。

2、教学模式基本要求充分利用多媒体进行教学,课堂讲授结合大量课堂实际训练、市场调查来进行。

在教学上运用循序渐进、由简到繁、环环相扣、因材施教的方法,使学生逐步理解和掌握字体设计的要领;在教学手段上采取理论讲授、课堂示范、作业点评、作品欣赏等形式。

并根据学生对本节课具体掌握情况具体指导,使他们尽快掌握难点。

3、考核方法基本要求:考试课程主要包括平时测验、作业、实验完成情况及实验报告、出勤情况等,其中学生迟到一次扣2分,直到扣完为止,旷课学时达到总学时的三分之一者本门课程没有成绩,上课时上网玩游戏每发现一次扣十分,直到扣为止。

J2EE项目实训UML及设计模式——第2章 需求分析和系统建模(第2部分)

J2EE项目实训UML及设计模式——第2章 需求分析和系统建模(第2部分)

第2章需求分析和系统建模(第2/3部分)1.1.1在Rose2003中创建项目的各个用例及用例图1、新建某个网上书店项目中的各个用例(1)新建项目中的各个用例所在的包在Rose工具的浏览区中右击【Use Case View】节点,然后在弹出的【New】菜单中选择【Package】菜单项目。

请见下面的图2.22所示的操作结果状态。

图2.22 新建项目中的各个用例所在的包(2)输入包的名称为“用例包”包是UML中最常用的管理模型复杂度的一种机制,它其实是一种容器,在包中可以容纳其它任意的模型元素(当然,也包括子包)。

通过建立出包,能够有效地管理各个用例,并能够分门别类地进行用例的存放。

请见下面的图2.23所示的操作结果状态。

图2.23 输入包的名称为“用例包”后的结果(3)在该包中增加本项目中的各个用例在Rose中分别添加本项目中的各个用例,如:Register、Login、Serach、BuyBook、CheckCart、OnLineQuery、DeleteUser、InsertUser、UpdateUser、DeleteBook、InsertBook、UpdateBook、BookKind等。

请见下面的图2.24所示的操作结果状态。

注意:上面的各个用例只涉及用户购买和管理员进行图书信息和用户管理的用例。

2、新建项目中的各个参与者(1)新建参与者所在的包通过建立包能够有效地管理各个参与者,并能够分门别类地进行存放。

包名称输入为“参与者包”,请见下面的图2.25所示的操作结果状态。

(2)在该包中增加本项目中所需要的各个参与者在Rose中分别添加各个参与者,如:图书信息的浏览者(Visitor,没有进行购买行为的用户)、图书的购买者(读者用户)、收银员(如财务人员)和管理员、超级管理员(Administrator,系统管理员)等,请见下面的图2.26所示的操作结果状态。

3、新建本项目中的各个用例图(1)新建一个用例图在Rose的浏览区中右击【Use Case View】节点,然后在弹出的【New】菜单中选择【Use Case Diagram】菜单项目。

设计思维与方法 课件完整版

设计思维与方法 课件完整版
图1-21 一般方法与设计方法的区别
第四节 认识设计思维和设计方法
一、认识设计思维
设计思维的特征完全体现于思
索过程中,无论针对什么设计主题 ,都具体地反映出思索线、思考点 、思维结构和思维规律,形成相互 紧密关联的设计思维的结构。在这 个结构中,思索线反映着意识作用 的方向;思考点反映着意识作用的 承载内容和范围;思维结构反映着 意识运动的连接关系;思维规律反 映着意识运动的内在联系。我们从 这些设计思维的突出现象上去把握 结构,对设计思维自然会形成比较 全面的认识(图1-22)。
图1-18 排列关联结构和重要环节的有效推进方法
价值目标推进是细化并确立阶
段价值指标的诉求方法。设计项目 的总体目标确立后,为确保整体项 目的高质量与高效率,需要把工作 内容分成若干个阶段,在每一阶段 中设定价值目标,诉求阶段性的设 计内容品质,从整体上把控项目的 有效推进。以价值目标推进,是就 项目内容而具体制定,不同的项目 ,针对相应的时期,诉求的阶段价 值指标具有不同的内容构成,有针 对性才有实效,对后面延续的内容 及整体项目的总价值才会真正体现 出本阶段的设计内容品质。针对每 图1-19 确立阶段价值指标的诉求方法 个项目,分设几个工作阶段,确定 每个阶段的价值指标,可以从方法 的推进上确保设计工作的成效(图 1-19)。
第一章 概述
第一节 思维与方法 第二节 一般思维与设计思维的区别 第三节 一般方法和设计方法的区别 第四节 认识设计思维和设计方法
第一章 概述
第一节 思维与方法
一、思维 人的思考力包括想象、空间、延伸的能力。 想象能力,是指人们面对一个具体内容点,由此产生出其
他的概念性内容。 空间能力,是指在三维尺度的概念条件中展开跨越。 延伸能力,是指在思考内容中繁衍和再生内容。 认识人的思维特征和内容,主要表现在上述想象、空间、

工业设计系列讲座——(二)设计思维与创造技法

工业设计系列讲座——(二)设计思维与创造技法

工业设计系列讲座——(二)设计思维与创造技法
朱崇贤
【期刊名称】《机械设计与研究》
【年(卷),期】1992()3
【摘要】一、设计理性与特点的思索历史证明:人类文明的源泉是创造;人类生活的本质是创造。

而设计,本质上就是创造性的思维与活动。

设计从广义上讲,说法不一,定义颇多,如: 1.设计是一种针对目标的问题求解活动;
【总页数】5页(P44-48)
【关键词】工业设计;讲座;设计;创造
【作者】朱崇贤
【作者单位】
【正文语种】中文
【中图分类】TB21
【相关文献】
1.工业设计系列讲座:第二讲设计领导着... [J], 严峻;简召全
2.创造性技法之二(连载)本文摘选自《创造性技法—QC小组课题选定新思维》[J], 市川享司
3.创造性思维与创造技法讲座(二) [J], 魏铁华
4.工业设计系列讲座之二产品设计的雅设计与俗设计 [J], 金文
5.工业设计中的创造技法 [J], 陈德辉
因版权原因,仅展示原文概要,查看原文内容请购买。

J2EE项目实训UML及设计模式——第7章 架构设计中的架构模式(第4部分)

J2EE项目实训UML及设计模式——第7章 架构设计中的架构模式(第4部分)

第7章架构设计中的架构模式(第4/4部分)1.1架构设计中的门面模式及应用1.1.1门面架构设计模式1、门面模式(Façade,也称外观模式)(1)门面模式在J2EE平台系统分层架构设计中的具体应用外部系统(一般为客户端组件)与一个子系统之间的通讯必须通过一个统一的门面组件对象进行,这就是门面模式。

对于门面模式在GOF 23种设计模式中也包括有,但本书在此侧重于门面模式在J2EE 平台中的系统分层架构设计中的具体应用及特殊性。

在Java平台中使用门面模式是非常方便而且普及的,比如在JDBC的数据库连接中统一使用基于DataSource接口的各个数据库连接对象来完成数据库连接,就是门面模式的具体应用。

(2)利用门面组件隔离业务处理层和持久层之间的关系的应用示例下面的图7.19所示为某个网上商城系统中的持久层设计中应用了DAO服务组件(DAO Service)作为业务处理层和持久层中各个DAO组件的门面,经过这样的分离后,在各个业务组件中只需要与DAO服务组件进行交互,而不需要与不同的DAO组件进行具体的交互。

其结果是降低了系统中的业务处理层和系统中的持久层中的数据访问组件之间的藕合性,将使得业务层组件的可重用性得到进一步地提高。

图7.19 DAO服务组件作为业务处理层和持久层中各个DAO组件的门面同时在J2EE EJB组件中的会话门面组件(Session Façade)也是门面模式的具体应用,这一般称为会话门面模式。

因为客户端组件与远程EJB组件进行交互时,其中的会话门面组件起重要作用,会话门面组件可以起到降低客户端与服务器端各个EJB组件之间的耦合关系的作用。

2、为什么要应用门面模式(1)在应用系统中客户需要与子系统内部的许多不同的对象进行交互比如在网上商城系统中的用户管理的业务层组件UserManageBean不仅需要应用有关用户信息访问的UserInfoDAOBean组件,也可能需要应用与商品信息访问的GoodsInfoDAOBean组件以查询获得某个用户所购买的各个商品的具体信息;这样的数据访问需要,同样在涉及订单业务功能管理的OrderManageBean中也存在。

最新高二通用技术-设计的基本方法和基础知识2课件分解教学讲义PPT课件


外形组合设计 多 功 能 螺 丝 刀
性能组合设计 通信光缆
原理组合设计
功能组合设计
模块组合设计
文艺晚会的表演由每一场文艺节目模块组合而成
家具、电器的摆放、装潢设计也是一种组合设计
系统的组合设计
计算机系统:由硬件系统和 软件系统的组合设计而成。
汽车也可以看作系统的组合设计
神舟六号飞船由发射系统、 监测系统、控制系统、航天员 系统、飞船本身系统和回收系 统等子系统组成。
以上设计主要考虑了哪些原则?
远望5号解决船舶稳性的方法
1.在船体上前后各装两个减摇鳍,把 十几度的摇摆减少到5度。
2. 在雷达基座上安装相关设备, 进而把5度的摇摆减少到1度。
3.在天线上安装相关设备,把1度 的摇摆减少到几秒。 三级减摇措施,就使主测量船在6
级海浪下达到了陆地标准,可以在 12级台风中昂首挺立。
军委主席:
成吉思汗
国务院总理:
诸葛亮
外交部长:
周恩来
卫生部长:
华佗
公安部长:
展昭
最高人民法院院长:包拯
国家禁 毒署署长: 林则徐
教育部长:
孔子
这样的人员配置,遵循了哪一原则?
(4)英国奥索假肢公司研制和发明 了智能仿生假肢,其仿生足内装有传
感器,由于这种智能感应,“本体” 的使用者可以更轻松自然地站或 坐下,步态也更加平衡矫健。
否 是最优化设计吗?

完成设计
进行鉴定
申请专利
四、技术设计的一般过程举例
发现问题
展开调查
制定方案
制作模型
测试优化
推广应用
分号的用法
分号
一、复习顿号使用方法
• 1、出示句子 • (1)课文《北大荒的秋天》中的“一道银

设计模式原则详解

设计模式原则详解这篇文章,不需要你一次就看懂,如果你真的能一次都看懂,我想设计模式对于你来说已经没什么难度了..因为设计模式就是要体现这些原则的,你可以把设计原则看做是一门语言,设计模式是由这些语言编码的程序..你既然已经明白,精通了语言,剩下的编码自然是很简单的事情,编码的越多则经验越多,经验越多则对原则的理解就越深...这是一个学习领悟的过程..我希望这篇文章能帮助新人感受到设计模式的乐趣,避免重复编码....减少劳动量..如果你能在用心静静的体会文章的每个字,每段话的意思,这样可以避免走很多弯路...我以前学习设计模式的时候,就是因为忽略了原则,凭着感觉,看着书来学习设计模式,结果就是知其然而不知其所以然....如果你是初学设计模式,再了解了OOP的三大原则(封套,继承,多态)之后,请反复的结合原则,来学习设计模式..这样可以达到事半功倍的效果...设计模式的核心原则是:"开-闭"原则( Open - Closed Principle 缩写:OCP ),一切的一切都是围绕着"开-闭"原则展开的..意思是,在一个系统中,对于扩展是开放的,对于修改是关闭的,一个好的系统是在不修改源代码的情况下,可以扩展你的功能..而实现开闭原则的关键就是抽象化.在"开-闭"原则中,不允许修改的是抽象的类或者接口,允许扩展的是具体的实现类,抽象类和接口在"开-闭"原则中扮演着极其重要的角色..即要预知可能变化的需求.又预见所有可能已知的扩展..所以在这里"抽象化"是关键!!!可变性的封闭原则:找到系统的可变因素,将它封装起来..这是对"开-闭"原则最好的实现..不要把你的可变因素放在多个类中,或者散落在程序的各个角落..你应该将可变的因素,封套起来..并且切忌不要把所用的可变因素封套在一起..最好的解决办法是,分块封套你的可变因素!!避免超大类,超长类,超长方法的出现!!给你的程序增加艺术气息,将程序艺术化是我们的目标!!里氏代换原则:任何基类可以出现的地方,子类也可以出现..如果你通读过<Java编程思想>,我想你应该明白这个原则,在书中,Bruce Eckel 大师用了大量的章节来讲解"向上转型"和"向下转型",我想目的很清楚,不仅是要你明白类的型别,更重要的是要你明白父类与子类的关系..依赖倒转原则:要依赖抽象,而不要依赖具体的实现..如果说开闭原则是目标,依赖倒转原则是到达"开闭"原则的手段..如果要达到最好的"开闭"原则,就要尽量的遵守依赖倒转原则..可以说依赖倒转原则是对"抽象化"的最好规范!!我个人感觉,依赖倒转原则也是里氏代换原则的补充..你理解了里氏代换原则,再来理解依赖倒转原则应该是很容易的..合成/聚合原则:要尽量使用合成/聚合原则,而不是继承关系达到软件复用的目的..此原则和里氏代换原则氏相辅相成的,两者都是具体实现"开-闭"原则的规范..违反这一原则:就无法实现"开-闭"原则..先来看看什么是合成,什么是聚合.什么是合成?合成:是指一个整体对依托他而存在的关系,例如:一个人对他的房子和家具,其中他的房子和家具是不能被共享的,因为那些东西都是他自己的..并且人没了,这个也关系就没了..这个例子就好像,乌鸡百凤丸这个产品,它是有乌鸡和上等药材合成而来的一样..也比如网络游戏中的武器装备合成一样,多种东西合并为一种超强的东西一样..什么是聚合?聚合:聚合是比合成关系的一种更强的依赖关系,聚合是一个整体对个体的部分,例如,一个奔驰S360汽车,对奔驰S360引擎,奔驰S360轮胎的关系..这些关系就是带有聚合性质的..因为奔驰S360引擎和奔驰S360轮胎他们只能被奔驰S360汽车所用,离开了奔驰S360汽车,它们就失去了存在的意义..在我们的设计中,这样的关系不应该频繁出现..这样会增大设计的耦合度..明白了合成和聚合关系,再来理解合成/聚合原则应该就清楚了..要避免在系统设计中出现,一个类的继承层次超过3次..如果这样的话,可以考虑重构你的代码,或者重新设计结构..当然最好的办法就是考虑使用合成/聚合原则...迪米特法则:系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度,因为在你的系统中,扩展的时候,你可能需要修改这些类,而类与类之间的关系,决定了修改的复杂度,相互作用越多,则修改难度就越大,反之,如果相互作用的越小,则修改起来的难度就越小..例如A类依赖B 类,则B类依赖C类,当你在修改A类的时候,你要考虑B类是否会受到影响,而B类的影响是否又会影响到C类..如果此时C类再依赖D类的话,呵呵,我想这样的修改有的受了..接口隔离法则:这个法则与迪米特法则是相通的,迪米特法则是目的,而接口隔离法则是对迪米特法则的规范..为了做到尽可能小的耦合性,我们需要使用接口来规范类,用接口来约束类.要达到迪米特法则的要求,最好就是实现接口隔离法则,实现接口隔离法则,你也就满足了迪米特法则...如果你能看这里,说明你已经对这些原则了有了感性的认识..这些原则是设计模式的核心,如果不能充分理解这些原则,是很难理解好设计模式的..。

《Java设计模式》教学大纲

《软件设计模式》教学大纲一、课程说明1、课程编号:2、课程名称(中/英文):软件设计模式/Software Design Patterns3、课程类别:专业课/限选4、学时/学分:32/2.05、先修课程:Java面向对象程序设计、软件工程6、适用专业:软件工程,计算机科学与技术,信息管理与信息系统7、教材、教学参考书:[1] 刘伟. Java设计模式. 北京: 清华大学出版社, 2018.[2] 刘伟. 设计模式实验及习题解析. 北京: 清华大学出版社, 2018.[3] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software.Addison-Wesley, 1995.[4] 结城浩. 图解设计模式. 北京: 人民邮电出版社, 2016.[5] 秦小波. 设计模式之禅(第2版). 北京: 机械工业出版社, 2014.[6] 陈臣, 王斌. 研磨设计模式. 北京: 清华大学出版社, 2010.二、课程性质和教学目的《软件设计模式》是软件工程、计算机科学与技术、信息管理与信息系统等专业本科生的一门专业课,本课程是一门具有较强理论性和实践性的软件设计和开发类课程。

本课程主要学习软件设计模式基础知识、UML类图、面向对象设计原则、常用的创建型设计模式、结构型设计模式和行为型设计模式。

本课程要求学生掌握常用软件设计模式的动机、定义、结构、实现、使用效果以及应用实例,能够将所学知识应用到实际软件项目设计与开发中,进一步培养学生的工程实践能力和专业技术水平,为今后从事相关工作奠定基础。

本课程首先学习软件设计模式的基本知识和UML类图;接着介绍常见的七个面向对象设计原则;然后重点介绍使用频率较高的软件设计模式,包括五种创建型设计模式(简单工厂模式、工厂方法模式、抽象工厂模式、原型模式、单例模式)、六种结构型设计模式(适配器模式、桥接模式、组合模式、装饰模式、外观模式、代理模式)和七种行为型设计模式(职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式、模板方法模式)。

4-2方案的构思过程(课件)-高中通用技术苏教版必修1

中学生学习的时间较长,眼睛易疲劳,为了保护其 视力,所要设计的台灯应连续平稳地发光,一般选择没 有频闪或频闪较低的灯泡。
5
支撑架
作用: 支撑作用,并决定台灯的高度,还会影响到 光线的利用率。
材料: 应选择高度应可调、耐6
灯罩
▪ 作用: 调节光线、安全保护
材料: 选择耐用、导热性弱、不透明、反光
度适宜、颜色和谐等特性的材料。
7
开关
作用:通断电源或调节光线亮度。(常见的台灯 开关有拨动式开关、旋钮式开关、触摸式开关、 光控开关、声控开关等。) 选择:手动或遥控开关
绝缘、耐用、经济实惠。
8
底座
作用: 支撑和稳定。 材料: 选择坚固的、不易碎的材料,体现个性 化的风格。
9
(6)电线: 花线 没有特别的要求
使用过程中的人机交互方式、使用维护等。
20
假如让你选择设计方案,你选择哪一个? 说明理由。如果你认为这些方案都不符合 要求,你会做什么样的改进?
21
方案C模块组合方式,可支持多种场景使用;形 式简单,摆放稳定;照明效果一般;安全性较好;制 作简单,价格适中。
方案D采用普通白炽灯泡,照明效果较差;造型 一般,结构有一定创新摆放稳定,耐久性较好; 19 安全性不高,价格便宜。
经过方案的比较与权衡,一个比较合理的设计 草案终于形成了。但很多细节仍然需要确定,如产 品及零部件的尺、结构关系、材料及标准件选配、
15
不同的设计阶段,考 虑技术交流的目的差异,设计方案呈现的手段、 方式、视角会有很大区别;个人设计观念的差异, 同样会导致不同的设计呈现方式。草图可以将一 些想法明确的表达出来,而且可以随意修改。
16
在构思形成多个方案后,要 对方案进行评判和比较,同时要从设计的目的 和原则出发,针对一些相互制约的问题进行分 析,选出较为满意的方案或集中各方案的 有优 点进行改进。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面向对象的程序设计与设计模式Object Oriented Programming and Design Patterns第五部分 面向对象与软件复用主讲:杨大川 中国科学院研究生院软件学院 2006年3月软件的维护维护的费用 = 开发的费用 * 2 维护的内容:清除错误与缺陷 扩充功能软件的维护= 软件的再生OOP中国科学院研究生院软件学院 - 杨大川2可维护性低的原因Legacy system 原因 (Rober Martin)Rigidity 过于僵硬 Fragility 过于脆弱 Immobility 复用率低 Viscosity 黏度过高OOP中国科学院研究生院软件学院 - 杨大川3可复用性传统的复用Copy-Paste 算法的复用 数据结构的复用 代码的复用可维护性与传统复用的矛盾例:A,B 同时使用C,A希望C增加一个功能, B不允许C增加这个功能。

OOP中国科学院研究生院软件学院 - 杨大川4面向对象的复用封装保持和促进系统的可维护性继承使得概念和定义可以复用多态使得实现和应用可以复用OOP中国科学院研究生院软件学院 - 杨大川5设计的目标可扩展性 (Extensibility) 灵活性 (Flexibility) 可插入性 (Pluggability)OOP中国科学院研究生院软件学院 - 杨大川6敏捷设计Agile Software Development 致力于保持系统设计在任何时间都尽可能 的简单、干净。

OOP中国科学院研究生院软件学院 - 杨大川7老子论不武士:软件工程师 武:对系统的大规模 修改擅为士 者不武OOP中国科学院研究生院软件学院 - 杨大川8老子论不武士:软件工程师 武:对系统的大规模 修改 道:软件复用 马:代码高手 天下有道,却走马 擅为士 以粪。

天下无道, 者不武 戎马生于郊。

OOP中国科学院研究生院软件学院 - 杨大川9软件复用的原则OCP:开-闭原则 SRP:单一职责原则 LSP:里氏代换原则 DIP:依赖倒转原则 ISP:接口隔离原则 CRP:合成复用原则 LoD:迪米特法则OOP中国科学院研究生院软件学院 - 杨大川10Open-Closed Principle 开-闭原则定义Software entities should be open forextension, but closed for modification.软件实体应该尽可能允许扩展,同时尽可能避免被更改。

太玄经固:close for modification革:open for extension知固而不知革,物失其则,知革而不知固,物失其均OCP的关键抽象技术abstract classInterface抽象预见了可能的所有扩展(闭)由抽象可以随时导出新的类(开)实例:手与门思考:如何在程序中模拟用手去开门和关门?行为:开门关门判断门的状态public class Door1 {private boolean_isOpen=false;public boolean isOpen(){return _isOpen;}public void open(){_isOpen= true;}public void close(){_isOpen= false;}}public class Hand1 { public Door1 door;void act() {if (door.isOpen())door.close();elsedoor.open();}}主程序public class Main1 {public static void main(String[] args) { Hand1 myHand= new Hand1();myHand.door= new Door1();myHand.act();}}新的问题需要手去开关抽屉,冰箱……?我们只好去修改程序……抽屉public class Drawer1 {private boolean_isOpen=false;public boolean isOpen(){return _isOpen;}public void open(){_isOpen= true;}public void close(){_isOpen= false;}}手(注意:被改变了!)public class Hand1 {public Door1 door;public Drawer1 drawer;public int item=0;void act() {switch (item){case 1:if (door.isOpen())door.close();elsedoor.open();break;case 2:if (drawer.isOpen())drawer.close();elsedrawer.open();break;}}}主程序public class Main1 {public static void main(String[] args) { Hand1 myHand= new Hand1();myHand.door= new Door1();myHand.item= 1;myHand.act();}}符合OCP的设计“可开关的”接口public interface Excutable{ public boolean isOpen();public void open();public void close();}门(新的)public class Door2 implements Excutable{ private boolean_isOpen= false;public boolean isOpen() {return _isOpen;}public void open() {_isOpen= true;}public void close() {_isOpen= false;}}抽屉(新的)public class Drawer2 implements Excutable{ private boolean_isOpen= false;public boolean isOpen() {return _isOpen;}public void open() {_isOpen= true;}public void close() {_isOpen= false;}}手(新的)public class Hand2 {public Excutable item;void act() {if (item.isOpen())item.close();elseitem.open();}}主程序public class Main2 {public static void main(String[] args) { Hand2 myHand= new Hand2();myHand.item= new Door2();myHand.act();}}Single Responsibility Principle单一职责原则核心思想就一个类而言,应该仅有一个引起它变化的原因。

实例:矩形系统一个GUI系统的设计。

要求:可以计算矩形的面积并在屏幕上显示脆弱的设计几何计算系统调用Rectangle计算面积GUI系统调用Rectangle绘制在屏幕上出现的问题编译几何计算系统时还需要编译进图形代码…需要更换显示系统时还需要重新测试所有几何计算系统…解决方法:将计算和绘制的职责分别放入CulRectangle和GraphRectangle中结论所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因引起该类变化,其实就是耦合了多个互不相关的职责,就会降低这个类的内聚性。

Liskov Substitution Principle里氏替换原则定义一个软件实体如果使用的是父类的话,一定适用于子类型。

软件设计时,子类应该设计成为子类型。

子类型vs. 子类反过来不成立。

墨子论马《墨子·小取》:白马,马也;乘白马,乘马也。

骊马,马也;乘骊马,乘马也。

+骑马(in 某马 : 马)墨子论美人《墨子·小取》:娣,美人也,爱娣,非爱美人也。

<<interface>>+喜爱(in x : 妹妹)长方形与正方形问题:假如我们有一个类,长方形。

我们需要一个新的类,正方形。

可否直接继承长方形?如果不考虑继承public class Rectangle {int width;int height;public void setWidth(int w) { width = w;}public int getWidth() {return width;}public void setHeight(int h) { height = h;}public int getHeight() {return height;}}public class Square { int side;public voidsetSide(int s) {side = s;}public int getSide() { return side;}}如果考虑继承public class Rectangle {int width;int height;public void setWidth(int w) { width = w;}public int getWidth() {return width;}public void setHeight(int h) { height = h;}public int getHeight() {return height;}}public class Square1 extends Rectangle {public void setWidth(int w) { width = w;height = w;}public void setHeight(int h) { width = h;height = h;}}Smart Testpublic static void resize(Rectangle r) { while (r.getHeight() <= r.getWidth()) { r.setHeight(r.getHeight() + 1);}System.out.println("Test finished."); }Rectangle r = new Rectangle();//Rectangle r = new Square1();r.setHeight(5);r.setWidth(15);resize(r);结果违背了LSP使用父类时,程序正常运行。

相关文档
最新文档