设计模式大作业

合集下载

经过一个学期的学习,请结合本次大作业,谈谈你对设计模式的理解及想法。(30分)

经过一个学期的学习,请结合本次大作业,谈谈你对设计模式的理解及想法。(30分)

经过一个学期的学习,请结合本次大作业,谈谈你对设
计模式的理解及想法。

(30分)
设计模式是软件开发的一种重要机制,可以用于提高代码的重复使用性、灵活性和可操作性。

本次大作业,我学习了五种设计模式:单例模式、抽象工厂模式、桥接模式、策略者模式和代理模式。

通过各种例子,我深
刻理解了设计模式的实用性:单例模式可以使类的实例只有一个,从而避
免额外的初始化资源。

抽象工厂模式为客户提供一个通用的接口,根据不
同参数创建出不同的实例,使客户不需要关注具体的实现。

桥接模式对对
象的实现和行为的实现进行分离,提高可拓展性。

策略者模式定义了一系
列可以互相替换的算法,从而使得算法可以独立于使用它的客户端而变化。

代理模式为另外一个对象提供了一个替代或者代表,从而限制、增强或修
改对它的访问。

从本次大作业的学习中,我的对设计模式的理解是,设计
模式是一种经过实践检验的良好设计,可以用于设计软件系统,以满足客
户的需求。

它能够提高代码的可复用性和灵活性,使软件系统更具有可维
护性和可扩展性。

建筑设计大作业

建筑设计大作业

建筑设计大作业作为建筑设计的一项重要任务,大作业要求设计师运用专业知识和创造力,提出对某个建筑项目的全面规划方案。

本文将从需求调研、设计理念、平面布局、立面设计和室内布置等方面进行论述,为建筑设计大作业提供指导。

一、需求调研在进行建筑设计大作业之前,首先需要进行充分的需求调研。

这包括对建筑项目的地理环境、气候条件、用途要求以及用户群体等方面进行详细了解。

通过调研,设计师可以收集到项目的基本信息,并理解项目的特殊需求,为后续的设计提供依据。

二、设计理念设计理念是建筑设计大作业的核心,它代表着设计师的创意和思考。

在确定设计理念时,设计师需要结合项目的需求、文化背景和环境特点,提出一个独特的、功能合理的设计理念。

理念应该突出项目的特点,引人注目,同时也要符合实际可行性和可持续发展的原则。

三、平面布局平面布局是指建筑物在水平方向上的布置。

在进行平面布局设计时,需要根据项目的用途和功能要求,合理划分建筑的功能区域。

对于住宅建筑,要考虑到采光、通风、隐私等因素;对于办公建筑,要注重工作流程和空间互动等要素。

设计师还应注意平面布局的合理性以及不同区域之间的协调性。

四、立面设计立面设计是建筑设计中的重要环节,它是建筑物外部的表现形式。

立面设计需要考虑到建筑的美观性、与周围环境的协调性,同时也要满足建筑功能的需求。

设计师可以运用不同的材料、形式和比例来创造立面的丰富性和变化度,使建筑物在视觉上更加有吸引力。

五、室内布置室内布置是建筑设计中的细节之一,要求考虑到人们在室内的舒适度和便利性。

在进行室内布置时,设计师需要根据建筑的用途和用户的需求,选择适当的家具、装饰、照明等元素,使室内空间既具有美感又满足功能需求。

此外,设计师还应注重室内的色彩搭配、材料选择和空间布局。

总结建筑设计大作业是一个全面的设计过程,需要运用各个方面的知识和技能。

通过对需求调研、设计理念、平面布局、立面设计和室内布置等方面的论述,本文为建筑设计大作业提供了一些建议和指导。

综合设计项目-大作业

综合设计项目-大作业

综合设计项目考核:占课程总分的20%任务1:用AT89C51和16个发光二极管构建一个单片机最小系统设计要求:发光二极管循环显示:由16个发光二极管组成一个彩灯图案,依次点亮循环2遍。

1、最小系统硬件电路的设计。

2、软件程序的编写、调试。

3、软、硬件联合仿真运行,显示结果。

任务2:用AT89C51、74LS164串/并移位寄存器芯片和2位共阴极数码管组成的静态显示器构建一个单片机最小系统。

设计要求:用单片机的P1.0作数据串行输出口,P1.1作移位脉冲输出口,使2位LED静态显示器显示数字“21”。

1、最小系统硬件电路的设计。

2、软件程序的编写、调试。

3、软、硬件联合仿真运行,显示结果。

任务3:用AT89C51和一组8×8点阵构建一个单片机最小系统设计要求:点阵循环显示:依次从第1行第1列线点亮直到第8行第8列线点亮。

1、最小系统硬件电路的设计。

2、软件程序的编写、调试。

3、软、硬件联合仿真运行,显示结果。

任务4:用AT89C51和LCD液晶显示器构建一个单片机最小系统设计要求:用LCD液晶显示器显示:第1行—姓名(拼音)和学号,第2行--身高(cm)和体重(kg)。

1、最小系统硬件电路的设计。

2、软件程序的编写、调试。

3、软、硬件联合仿真运行,显示结果。

任务7:用AT89C51和4组8×8点阵构建一个单片机最小系统。

设计要求:用字模提取软件产生“单片机技术与应用”8个汉字的汉字库,控制四组8×8点阵(即一个16×16点阵),编码显示汉字“单片机技术与应用”1、最小系统硬件电路的设计。

2、软件程序的编写、调试。

3、软、硬件联合仿真运行,显示结果。

任务8:用AT89C51和图形点阵液晶显示器-AMPIRE128×64构建一个单片机最小系统。

设计要求:用字模提取软件产生汉字库,控制液晶显示器显示【唐】孟浩然的诗《春晓》的四句:春眠不觉晓,处处闻啼鸟。

综合课程设计的大作业

综合课程设计的大作业

综合课程设计的大作业一、教学目标本课程的教学目标是让学生掌握XX学科的基本知识和技能,能够运用所学知识解决实际问题。

在情感态度价值观方面,希望学生能够培养对XX学科的兴趣和热情,形成积极探究的学习态度。

具体来说,知识目标包括:1.掌握XX学科的基本概念和原理;2.了解XX学科的发展历程和应用领域;3.学习XX学科的基本方法和技巧。

技能目标包括:1.能够运用XX学科的知识解决实际问题;2.具备XX学科的基本实验操作能力;3.学会XX学科的思维方法和研究方法。

情感态度价值观目标包括:1.培养对XX学科的兴趣和热情;2.形成积极探究的学习态度;3.培养团队合作和交流分享的能力。

二、教学内容根据课程目标,教学内容主要包括XX学科的基本概念和原理、发展历程和应用领域、基本方法和技巧。

具体来说,教学大纲安排如下:1.第一章:XX学科的基本概念和原理;2.第二章:XX学科的发展历程和应用领域;3.第三章:XX学科的基本方法和技巧。

教材选用《XX学科基础》一书,内容与教学目标紧密相关,符合教学实际。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。

1.讲授法:用于传授基本概念和原理,引导学生掌握XX学科的知识框架;2.讨论法:通过小组讨论,培养学生的思考能力和团队合作精神;3.案例分析法:分析实际案例,让学生学会运用所学知识解决实际问题;4.实验法:进行实验操作,培养学生的实验技能和科学思维。

四、教学资源本课程所需教学资源包括教材、参考书、多媒体资料和实验设备。

1.教材:《XX学科基础》;2.参考书:提供更多的学习资料,丰富学生的知识体系;3.多媒体资料:包括PPT、视频等,用于辅助教学,提高学生的学习兴趣;4.实验设备:用于实验教学,让学生亲手操作,增强实践能力。

教学资源的选择和准备将充分支持教学内容和教学方法的实施,丰富学生的学习体验。

五、教学评估本课程的评估方式包括平时表现、作业和考试等,旨在全面、客观、公正地反映学生的学习成果。

软件设计模式大作业样例

软件设计模式大作业样例

设计模式大作业课程名称:软件设计模式设计题目:公司经费申请院系:计算机科学与信息工程学院学生姓名:学号:专业班级:软件工程13-1指导教师:**2016年6月软件设计模式任务书目录一、系统目标 ...................................................................................... 错误!未定义书签。

1. 设计目的......................................................................................... 错误!未定义书签。

2. 需求描述......................................................................................... 错误!未定义书签。

二、系统模块选择 ............................................................................... 错误!未定义书签。

1. 需求分析......................................................................................... 错误!未定义书签。

2. 选用设计模式 (2)(1)模板方法模式 (2)(2)职责链模式......................................................................... 错误!未定义书签。

(3)观察者模式 (3)三、系统设计 (4)1. 系统功能模块设计 (4)四、系统实现 (5)1.模板方法模块及其实现类 (5)2.职责链模块及其实现类 (6)3.观察者模块及其实现类 (9)4.事件处理程序 (10)五、系统设计总结 (11)1. 实现的功能和优点 (11)2. 不足之处 (12)3. 完成心得 (12)六、参考文献 (12)参考文献 (12)一、系统目标1.设计目的通过本课程设计,加深对软件设计课程的理解,熟练掌握和巩固所学的各种设计模式,培养自我动手、查阅技术文献、资料、手册以及编写技术文献的能力。

设计模式大作业报告

设计模式大作业报告

《设计模式》课程大作业报告姓名:陈明专业:软件工程班级:1202日期:2015年5月29日西安欧亚学院2014—2015学年第二学期考试试卷专业:软件工程 课程:设计模式 年级:12级完成一个综合项目程序,其中使用所学设计模式两个或者两个以上。

要求在文档中首先给出项目程序完成的功能或者解决的问题,然后详细说明模式使用的具体情况,即角色和相应程序代码。

文档赋分标准如下:1、程序功能阐述明确,分析清楚。

(15分)2、使用两种设计模式,使用得当,并给出相应的角色及程序代码,程序代码有恰当的注释。

(60分)3、文档格式正确,排版清晰。

(15分)4、如果使用超过两种设计模式,并且使用正确。

(10分)说明:以上总分为个人的期末成绩,本课程个人总成绩=平时成绩*40%+期末成绩*60%。

号_____________ 班级___________ 姓名________ 考场号____ 座位号____- -- - - - -- - - - - - - -- - - -- -- -密 ○- - - - - - - - - - - - - - -- - - -- -- - -封 ○- - - - - - - - - - - - -- - - --- - - -- -线 ○- - - - - - - - - - -- - - - -- - - - -- - - -- - - --用户和药店以及制药厂交互的例子一、程序功能描述工厂方法模式:为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,而不直接使用Drug的子类的构造方法直接创造对象。

因为药店没有能力给出药品的各个成分的含量,只有药厂才有这样的能力。

抽象工厂模式:通过创建多个药品工厂的类,让用户可以和创建的对象的类进行脱耦,为用户提供多个相关的药品,方便用户联合使用它们,用户不需要知道药品具体的生产过程将“工厂方法模式”与“抽象工厂模式”相结合,实现用户和创建对象的类脱耦,并且为用户提供多个相关的对象。

设计模式大作业

设计模式大作业

设计模式大作业摘要:随着软件系统规模和复杂性的增加, 人们对软件的可靠性和生产效率也提出了更高的要求, 软件重用在当前比以往任何时候都显得重要. 设计模式是系统设计阶段的软件重用, 使得那些具有良好性能的设计方案可以在相似环境下被再次复用. 设计模式以文档的形式把面向对象的软件设计经验记录下来, 并予以系统的命名、解释和评价, 使开发人员在进行系统的设计与开发时, 可以使用别人的成功经验而不必为普通的、重复的问题重新设计解决方案,使设计者更容易理解其设计思路,能为自己的问题找到更合适的解决办法,帮助设计者更快更好地完成系统设计.1.设计模式简介设计模式是针对面向对象系统中重复出现的设计问题,提出一个通用的设计方案,并予以系统化的命名和动机解释。

它描述了问题,提出了解决方案,并指出在什么条件下使用该方案以及其效果。

该解决方案是解决该问题的一组精心安排的通用的类和对象,再经过定制和实现就可用来解决特定的上下文中的问题。

简单来说,设计模式就是一个常用的方案。

在我们的开发过程中经常会遇到一些相同或相近的问题,如果每次都寻找一个相应的解决办法&那么就会增加开发时间,降低开发效率。

为了节省时间&提高开发效率&就需要提供一些解决类似问题的,在应用中被证明可行的方案设计模式。

所以一个设计模式就是描述了一个被证明可行的方案,这些方案可以重用,有良好的伸缩性。

一般而言,一个设计模式有四个要素:1.模式名称2.问题。

3.解决方案。

4.效果。

2.设计模式的分类根据两条准则对模式进行分类,范围准则和目的准则。

范围准则,即指定设计模式主要是用于类还是用于对象。

设计模式为:(1)类设计模式:处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来了。

(2)对象设计模式:处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性。

从某种意义上来说,几乎所有设计模式都使用继承机制,所以“类设计模式”只指那些集中于处理类间关系的设计模式,而大部分设计模式都属于对象设计模式的范畴。

设计模式大作业——斗地主程序

设计模式大作业——斗地主程序
刘品时序图人机对战游戏参与者电脑智能图像管理音效管理控制器刷新画面10输出音效11游戏主循环12游戏结束输出结果游戏参与者网络通信模块图像显示模块音效输出模块控制模块打开游戏大厅初始化环境获取局域网信息初始化图像初始化音效选取游戏对手生成游戏对象是否组建游戏参与游戏创建游戏主机建立稳定的连接创建游戏从机开始游戏开始游戏动作刷新图像输出音效游戏循环游戏逻辑判断传输游戏信息是否结束通知游戏结束输出游戏概要推出游戏环境结束操作时序图多人对战游戏参与者网络通信模块图像显示模块音效输出模块控制模块打开游戏大厅初始化环境获取局域网信息初始化图像初始化音效选取游戏对手生成游戏对象是否组建游戏参与游戏创建游戏主机建立稳定的连接创建游戏从机开始游戏开始游戏动作刷新图像输出音效游戏循环游戏逻辑判断传输游戏信息是否结束通知游戏结束输出游戏概要推出游戏环境结束操作游戏中的设计模式声音模块网络模块工厂模式门面模式模式监听者模式模式纸牌管理声音模块soundplayerisstop
+Card(m: Main, name: String) +turnFront() +turnRear() +mouserPressed() +getName()
CardManager
<<static>>-manager: CardManager <<static>>-map: Map
<<static>>+init(main: Main) <<static>>+getInstance() +getAll() +getCard(key: String) +getRandomSequence(list: List)

大作业课程设计

大作业课程设计

大作业课程设计一、课程目标知识目标:1. 学生能掌握课程核心概念,理解并运用所学的知识点解决实际问题。

2. 学生能通过本课程的学习,对学科知识体系有更深入的理解,形成知识网络。

3. 学生能运用课本知识,分析案例,提高对学科知识的理解和应用能力。

技能目标:1. 学生通过课程学习,提高自主学习、合作学习和解决问题的能力。

2. 学生能运用所学技能,进行实际操作,提高动手实践能力。

3. 学生能运用信息技术手段,搜集、整理、分析相关信息,提高信息素养。

情感态度价值观目标:1. 学生培养对学科的兴趣和热情,树立正确的学习态度。

2. 学生在学习过程中,培养合作精神,学会尊重他人,增强团队意识。

3. 学生通过课程学习,培养创新意识,激发创造力,提高综合素质。

4. 学生能够关注社会现象,将所学知识与现实生活相结合,增强社会责任感。

分析课程性质、学生特点和教学要求,本课程目标旨在让学生在掌握学科知识的基础上,提高实践操作能力和解决问题的能力,同时培养良好的情感态度价值观,使学生在知识、技能和情感各方面得到全面发展。

通过分解课程目标为具体的学习成果,有助于后续的教学设计和评估。

二、教学内容本课程依据课程目标,结合课本内容,选择以下教学内容:1. 知识点讲解:包括课程核心概念、原理及其应用,涵盖课本第1-3章的主要内容。

- 第一章:基础理论- 第二章:实践应用- 第三章:案例分析2. 技能训练:以课本第4-5章为基础,进行实践操作和动手能力的培养。

- 第四章:实际操作技能- 第五章:信息技术应用3. 情感态度价值观培养:结合课本第6章及课外资源,进行以下方面的教育。

- 第六章:团队协作与沟通- 课外活动:创新意识与社会责任教学大纲安排如下:第一周:第一章基础理论,第二章实践应用第二周:第三章案例分析,第四章实际操作技能第三周:第五章信息技术应用,情感态度价值观培养第四周:综合训练,总结与反馈教学内容确保科学性和系统性,以教材为基础,结合教学实际,使学生能够循序渐进地掌握知识,提高技能,培养情感态度价值观。

教学中的大作业

教学中的大作业

教学中的大作业一、引言大作业是学生在学习某个课程时所完成的最重要的任务之一。

它不仅可以检验学生对知识点的掌握程度,同时也能够培养学生的独立思考能力和实践能力。

在教学中,如何设计和指导大作业是一个非常重要的问题。

二、大作业设计1.明确目标在设计大作业时,首先需要明确目标。

目标应该与课程内容相关,并且应该具有挑战性。

例如,在计算机科学中,一个合适的目标可能是让学生开发一个简单的软件应用程序。

2.选择主题选择主题时需要考虑到以下几个方面:(1)与课程内容相关;(2)与现实问题相关;(3)具有足够挑战性;(4)适合学生自主选择。

3.制定任务清单制定任务清单可以帮助学生更好地组织和管理他们的工作。

任务清单应该包括每个任务所需的时间、资源和技能等信息。

4.确定评估方式评估方式应该与目标相一致,并且应该明确评估标准。

例如,在计算机科学中,一个合适的评估方式可能是让学生提交源代码并进行代码审查。

三、大作业指导1.提供支持和反馈在学生完成大作业的过程中,老师应该提供支持和反馈。

这可以包括课堂讲解、在线讨论、指导实验等。

2.鼓励学生自主学习大作业是一个很好的机会,让学生自主学习。

老师应该鼓励学生自己探索问题并寻找解决方案。

3.促进合作与交流合作与交流对于完成大作业非常重要。

老师可以通过组织小组讨论、在线讨论等方式来促进合作与交流。

四、大作业评估1.明确评估标准评估标准应该明确,并且应该基于目标和任务清单来制定。

2.考虑多种评估方法除了传统的书面报告外,还可以考虑使用其他形式的评估方法,如演示、口头报告等。

3.及时给予反馈及时给予反馈对于学生的成长非常重要。

老师应该在提交期限后尽快给予反馈,并提供改进建议。

五、总结设计和指导大作业是教学中非常重要的一环。

通过明确目标、选择主题、制定任务清单、确定评估方式、提供支持和反馈、鼓励学生自主学习、促进合作与交流以及明确评估标准等方式,可以帮助学生更好地完成大作业,并且提高他们的实践能力和独立思考能力。

软件设计模式与重构大作业

软件设计模式与重构大作业

软件设计模式与重构大作业一、前言本文是对软件设计模式与重构大作业的全面详细回答,主要包括以下几个方面:软件设计模式的概念、分类及应用;重构的概念、原则及方法;大作业的具体实现过程及效果分析。

本文将采用分层次的优美排版方式,以便读者更好地理解和掌握相关知识。

二、软件设计模式1.概念软件设计模式是指在软件开发过程中,经过总结和归纳出来的一些通用解决问题的方法和技巧。

它们是针对某些常见问题提出的解决方案,可以帮助开发人员更加高效地完成任务。

2.分类根据《设计模式:可复用面向对象软件的基础》一书中提出的分类方法,软件设计模式可以分为以下三类:(1)创建型模式:这类模式关注对象创建过程中各个部分之间如何协同工作,以及如何避免紧耦合。

常见的创建型模式有工厂方法模式、抽象工厂模式、单例模式等。

(2)结构型模式:这类模式关注对象之间如何组成更大的结构,并且保证这些结构对系统变化不敏感。

常见的结构型模式有适配器模式、装饰器模式、代理模式等。

(3)行为型模式:这类模式关注对象之间如何协作以完成特定任务,以及如何将责任分配给不同的对象。

常见的行为型模式有观察者模式、命令模式、策略模式等。

3.应用软件设计模式可以应用于各种编程语言和开发环境中。

例如,在Java语言中,常用的设计模式有工厂方法模式、单例模式、观察者模式等。

这些设计模式可以帮助开发人员更好地组织代码,提高代码复用性和可维护性。

三、重构1.概念重构是指在不改变代码外部行为的前提下,对现有代码进行优化和改进。

它可以帮助开发人员更好地理解和维护代码,并且提高代码质量和可读性。

2.原则重构需要遵循以下几个原则:(1)保持代码外部行为不变:重构过程中不能改变代码的外部行为,否则可能会引入新的错误。

(2)小步前进:重构过程中需要一步一步地进行调整,每次只修改一个问题点。

(3)持续集成:重构过程中需要保证代码的可编译性和可运行性,以便及时发现问题并进行修复。

3.方法重构可以采用以下几种方法:(1)提取方法:将一段代码抽取出来,形成一个新的方法。

现代设计理论与方法作业-(大作业)

现代设计理论与方法作业-(大作业)

现代机械设计理论与方法(大作业)1、采用系统化设计流程及所学现代设计方法详细阐述某公司需要投资研发一款新型产品的整个设计流程和采用方法。

(1)请具体阐述采用哪些设计方法,如何去完成新产品的规划设计过程?(2)请具体阐述采用哪些设计方法,如何去完成新产品的方案设计过程?(3)请具体阐述采用哪些设计方法,如何去完成新产品的技术设计过程?(4)请具体阐述采用哪些设计方法,如何去完成新产品的施工设计过程?答:(1)产品规划设计包括三个主要阶段:第一个阶段是市场细分及选择阶段。

在这个阶段,主要通过市场调研与分析,研究如何细分市场,以及企业如何选择细分市场,最后确定企业对细分市场的战略选择。

第二个阶段是定义新产品概念。

在这个阶段中要对某个细分市场,收集其需求的主要内容,包括客户需求、竞争需求及企业内部需求,并确定企业在该细分市场的产品定位,然后寻找和定义新产品概念。

第三个阶段是确定产品规划阶段。

在这一阶段中需要从技术层面分析新产品属于哪个产品族及其开发路径,并根据公司的战略确定新产品开发的优先顺序和组合策略,然后依据企业资源状况,制定新产品开发的时间计划。

产品规划设计的步骤为:信息集约→产品设计任务→预测调研→可行性分析→明确任务要求→可行性报告、设计要求项目表。

进行产品规划设计的主要方法有:设计方法和预测技术。

支持产品规划设计的主要理论有:设计方法学、技术预测理论、市场学、信息学等。

(2)新产品的方案设计过程大致可以分为方案设计和方案评审两个阶段。

方案设计阶段的步骤为:总共能分析→功能分解→功能元求解→功能载体组合→获得功能原理方案(多个原理方案)→原理试验→评价决策→最优原理方案→原理参数表、方案原理图。

进行产品的方案设计的方法主要有:系统化设计方法、创造技法、评价决策法、形态学矩阵法。

主要的理论指导包括:系统工程学、形态学、创造学、思维心理学、决策论、模糊数学等。

(3)对产品进行技术设计时,首先要对结构进行总体设计,包括了对产品的结构设计和造型设计。

软件设计与体系结构大作业-设计模式

软件设计与体系结构大作业-设计模式

软件设计与体系结构⼤作业-设计模式代码地址:设计模式:1. ⼯⼚模式。

为满⾜需求2,采⽤⼯⼚模式设计门店。

根据依赖倒置原则,倒置设计思路,不从“顶端”的披萨店开始设计,⽽从披萨开始。

⾸先抽象出⼀个Pizza类,再回头思考如何设计PizzaStore类,这样PizzaStore类就会依赖抽象的Pizza类,⽽不需要理会具体的Pizza类,从⽽使得具体不同种类的披萨和抽象的PizzaStore类都依赖于这个抽象的Pizza类,从⽽使得设计符合依赖倒置原则。

⽽PizzaStore则通过⼯⼚⽅法创建具体Pizza。

⼯⼚⽅法模式的类图:为了满⾜需求1,再创建⼀个原料⼯⼚,负责创建Pizza所需的⾯饼、酱料、芝⼠等原料,供制作Pizza时使⽤。

Pizza的代码利⽤相关的⼯⼚⽣产原料,所⽣产的原料依赖所使⽤的⼯⼚,Pizza类根本不关⼼这些原料,从⽽实现Pizza和具体原料的完全解耦。

因此整个⼯⼚实际上是抽象⼯⼚模式,允许披萨店使⽤抽象接⼝获得⼀组相关产品(原料),从⽽使披萨店和原料解耦。

通过⼯⼚模式,我们可以很容易地创建新的原料⼯⼚和披萨店,且符合开闭原则和接⼝原则,只需要直接增加新的类,实现PizzaStore和PizzaIngredientFactory中的抽象⽅法即可,使得整个系统⾮常具有弹性。

2. 装饰者模式。

为满⾜需求3和需求4,可以⽤装饰者模式负责创建⾃定义Pizza。

由于需要⾃定义Pizza,涉及到属性和价格的变化,为了满⾜开闭原则,使⽤装饰者模式是最佳选择。

即每个装饰的组件和基本的被装饰的组件,均继承⾃Pizza抽象类,并重写其cost()和prepare()等⽅法,每个装饰组件均有⼀个指针指向被装饰者,从⽽使得这些⽅法可以先委托给被装饰者,然后再调⽤⾃⼰的⽅法,从⽽实现动态地将责任附加到对象上,可以更弹性地扩展功能。

3. 单件模式。

为满⾜需求5,需要使⽤单件模式,创建全局唯⼀的价⽬表对象。

设计模式大作业实验报告

设计模式大作业实验报告

蛋糕订购系统一、实验介绍 (3)二、实验环境 (3)三、系统流程 (3)四、系统总类图 (4)五、程序源代码及各个模块子类图 (5)六、程序运行截图 (22)七、实验总结 (22)一、实验介绍本系统使用了简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式、观察者模式一共6种模式实现了从蛋糕店订购订购蛋糕的这样一个系统。

二、实验环境Windows操作系统、MyEclipse10.0、MySQL 5.5、jdk1.6 三、系统流程四、系统总类图五、程序源代码及各个模块子类图(一)测试类Client.java:package net.xsl.ordercake.test;import net.xsl.ordercake.discount.DiscountStyleThree;import net.xsl.ordercake.discount.OrderCake;import net.xsl.ordercake.order.CakeShop;import net.xsl.ordercake.order.EastVilla;import net.xsl.ordercake.order.WestVilla;public class Client {public static void main (String arg[]){CakeShop starCakeShop = CakeShop.getCakeShop();new WestVilla(starCakeShop, "草莓水果");starCakeShop.getNewName("西13");starCakeShop.notifyCustomer();OrderCake cake = new OrderCake();System.out.println("今日促销一律8折优惠");cake.setM(8);cake.setStyle(new DiscountStyleThree());cake.setPrice(80) ;System.out.println("本次订购成功完成,需要支付的金额为"+cake.getMoney(cake.getPrice(),cake.getM())+",原价80");System.out.println("=================================");new EastVilla(starCakeShop, "甜奶");starCakeShop.getNewName("东18");starCakeShop.notifyCustomer();System.out.println("=================================");starCakeShop.getNewName("东12");starCakeShop.notifyCustomer();}}(二)折扣的接口和方法(策略模式):a)接口DiscountStyle.java:package net.xsl.ordercake.discount;public interface DiscountStyle {public double disCount(double price,double m);}b)折方式一DiscountStyleOne.java:package net.xsl.ordercake.discount;public class DiscountStyleOne implements DiscountStyle{public double disCount(double price,double m) {return price;}}c)打折方式二DiscountStyleTwo.java:package net.xsl.ordercake.discount;public class DiscountStyleTwo implements DiscountStyle{public double disCount(double price,double m) {price = price - m;return price;}}d)打着方式三DiscountStyleThree.java:package net.xsl.ordercake.discount;public class DiscountStyleThree implements DiscountStyle{ public double disCount(double price,double m) {price = price * m/10;return price;}}e)订蛋糕对象类,使用了get/set方法OrderCake.java:package net.xsl.ordercake.discount;public class OrderCake {double money,price;//money是打折后的最终价格,price是原价DiscountStyle style;double m;public double getMoney(double price,double m){return style.disCount(price,m);}public void setPrice(double price){this.price = price ;}public double getPrice(){return price;}public void setStyle(DiscountStyle style){this.style = style ;}public DiscountStyle getStyle(){return style;}public void setM(double m){this.m = m ;}public double getM(){return m;}}(三)顾客向蛋糕订购蛋糕(观察者模式),并在具体主题中使用了单例模式a)主题Shop.java:package net.xsl.ordercake.order;public interface Shop {public void addCustomer(Customer o);public void deleteCustomer(Customer o);public void notifyCustomer();}b)具体主题(使用了单例模式,只能创建一个蛋糕商店的对象)CakeShop.java:package net.xsl.ordercake.order;import java.util.ArrayList;public class CakeShop implements Shop{String name;boolean changed;ArrayList<Customer>personList;private int i = 0;private static CakeShop uniqueCakeShop;private CakeShop() {uniqueCakeShop = this;personList = new ArrayList<Customer>();name = "";changed = false;}public static synchronized CakeShop getCakeShop(){if(uniqueCakeShop == null){uniqueCakeShop = new CakeShop();}return uniqueCakeShop;}public void addCustomer(Customer o) {if(!(personList.contains(o)))personList.add(o);}public void deleteCustomer(Customer o) {if((personList.contains(o)))personList.remove(o);}public void notifyCustomer() {if(changed){try{Customer customer = personList.get(i);customer.orderCake(name);i++;changed = false;}catch(Exception e){System.out.println("没有新的订购信息");}}}public void getNewName(String str){if(str.equals(name))changed = false;else{name = str;changed = true;}}}c)观察者Customer.java:package net.xsl.ordercake.order;public interface Customer {public void orderCake(String name);}d)体观察者一EastVilla.java:package net.xsl.ordercake.order;import net.xsl.ordercake.creator.MakeChocolateCake;import net.xsl.ordercake.creator.MakeFruityCake;import net.xsl.ordercake.creator.MakeMilkCake;import net.xsl.ordercake.jdbc.JDBCFacade;import net.xsl.ordercake.product.ChocolateFactory;import net.xsl.ordercake.product.FruitFactory;import kFactory;public class EastVilla implements Customer{Shop shop;private String cakeType;public EastVilla(Shop shop,String cakeType){this.shop = shop;this.cakeType = cakeType;shop.addCustomer(this);}public void orderCake(String name){System.out.println(name+"订了一个"+cakeType+"蛋糕");JDBCFacade dbFacade=new JDBCFacade();String sqlStr = "select * from ordercake";String sqlStr1 = "insert into ordercake(cakeType, name, quantity)"+ " VALUES ('"+cakeType+"','"+name+"','1')";dbFacade.jdbcInsert(sqlStr1);System.out.println("查询插入之后新的数据库");dbFacade.jdbcSelect(sqlStr);if(cakeType.equals("草莓水果") || cakeType.equals("葡萄水果")){MakeFruityCake eastVilla = new MakeFruityCake(cakeType);FruitFactory fruitCake = eastVilla.makeFruityCake();fruitCake.createCake();}else if(cakeType.equals("牛奶巧克力") || cakeType.equals("黑巧克力")){MakeChocolateCake eastVilla1 = newMakeChocolateCake(cakeType);ChocolateFactory chocolateCake =eastVilla1.makeChocolateCake();chocolateCake.createCake();}else if(cakeType.equals("双层鲜奶") || cakeType.equals("甜奶")){MakeMilkCake eastVilla1 = new MakeMilkCake(cakeType);MilkFactory milkCake = eastVilla1.makeMilkCake();milkCake.createCake();}}}e)具体观察者二WestVilla.java:package net.xsl.ordercake.order;import net.xsl.ordercake.creator.MakeChocolateCake;import net.xsl.ordercake.creator.MakeFruityCake;import net.xsl.ordercake.creator.MakeMilkCake;import net.xsl.ordercake.jdbc.JDBCFacade;import net.xsl.ordercake.product.ChocolateFactory;import net.xsl.ordercake.product.FruitFactory;import kFactory;public class WestVilla implements Customer{Shop shop;private String cakeType;public WestVilla(Shop shop,String cakeType){this.shop = shop;this.cakeType = cakeType;shop.addCustomer(this);}public void orderCake(String name){System.out.println(name+"订了一个"+cakeType+"蛋糕");JDBCFacade dbFacade=new JDBCFacade();String sqlStr = "select * from ordercake";String sqlStr1 = "insert into ordercake(cakeType, name, quantity)"+ " VALUES ('"+cakeType+"','"+name+"','1')";dbFacade.jdbcInsert(sqlStr1);System.out.println("查询插入之后新的数据库");dbFacade.jdbcSelect(sqlStr);if(cakeType.equals("草莓水果") || cakeType.equals("葡萄水果")){MakeFruityCake westVilla = new MakeFruityCake(cakeType);FruitFactory fruitCake = westVilla.makeFruityCake();fruitCake.createCake();}else if(cakeType.equals("牛奶巧克力") || cakeType.equals("黑巧克力")){MakeChocolateCake westVilla1 = newMakeChocolateCake(cakeType);ChocolateFactory chocolateCake =westVilla1.makeChocolateCake();chocolateCake.createCake();}else if(cakeType.equals("双层鲜奶") || cakeType.equals("甜奶")){MakeMilkCake westVilla1 = new MakeMilkCake(cakeType);MilkFactory milkCake = westVilla1.makeMilkCake();milkCake.createCake();}}}(四)JDBC(门面模式)JDBCFacade.java:package net.xsl.ordercake.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;public class JDBCFacade {Connection conn = null;Statement stmt = null;ResultSet rs = null;String sqlStr = "";public void createStatement() {try {stmt = conn.createStatement();} catch (SQLException e) {e.printStackTrace();}}public ResultSet jdbcSelect(String sqlStr){this.sqlStr = sqlStr;getConnection();createStatement();try {rs = stmt.executeQuery(sqlStr);ResultSetMetaData rsmd = rs.getMetaData();int j = 0;j = rsmd.getColumnCount();while(rs.next()){for(int i=0;i<j;i++){System.out.print(rs.getString(i+1));System.out.print("\t");}System.out.println();}} catch (SQLException e) {e.printStackTrace();}return rs;}public void jdbcUpdate(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("表更新 " + count + " 条数据");} catch (SQLException e) {System.out.println("更新数据失败");}}public void jdbcInsert(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("向表插入 " + count + " 条数据");} catch (SQLException e) {System.out.println("插入数据失败" + e.getMessage());}}public void jdbcDelete(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("向表删除 " + count + " 条数据");} catch (SQLException e) {System.out.println("删除数据失败");}}public void jdbcClose(){try {rs.close();stmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}public Connection getConnection() {try {Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cakeshop","root","admin");} catch (Exception e) {System.out.println("数据库连接失败" + e.getMessage());}return conn;}}(五)构造蛋糕(工厂方法模式):a)构造者MakeCake.java:package net.xsl.ordercake.creator;public interface MakeCake {}b)具体构造者一MakeChocolateCake.java:package net.xsl.ordercake.creator;import net.xsl.ordercake.product.ChocolateFactory;public class MakeChocolateCake implements MakeCake{ private String cakeType;public MakeChocolateCake(String cakeType){this.cakeType = cakeType;}public ChocolateFactory makeChocolateCake(){return new ChocolateFactory(cakeType);}}c)具体构造者二MakeFruityCake.java:package net.xsl.ordercake.creator;import net.xsl.ordercake.product.FruitFactory;public class MakeFruityCake implements MakeCake{ private String cakeType;public MakeFruityCake(String cakeType){this.cakeType = cakeType;}public FruitFactory makeFruityCake(){return new FruitFactory(cakeType);}}d)具体构造者三MakeMilkCake.java:package net.xsl.ordercake.creator;import kFactory;public class MakeMilkCake implements MakeCake{ private String cakeType;public MakeMilkCake(String cakeType){this.cakeType = cakeType;}public MilkFactory makeMilkCake(){return new MilkFactory(cakeType);}}e)抽象产品Factory.java:package net.xsl.ordercake.product;public interface Factory {public void createCake();}f)具体产品一FruitFactory.java:package net.xsl.ordercake.product;public class FruitFactory implements Factory{ private String cakeType;public FruitFactory(String cakeType){this.cakeType = cakeType;}public void createCake(){try{if (cakeType.equals("草莓水果")){FruityCake strawberryCake = new StrawberryCake();strawberryCake.show();}else if (cakeType.equals("葡萄水果")) {FruityCake grapeCake = new GrapeCake();grapeCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}g)具体产品二MilkFactory.java:package net.xsl.ordercake.product;public class MilkFactory implements Factory{private String cakeType;public MilkFactory(String cakeType){this.cakeType = cakeType;}public void createCake(){try{if (cakeType.equals("双层鲜奶")){MilkCake doubleMilkCake = new DoubleMilkCake();doubleMilkCake.show();}else if (cakeType.equals("甜奶")) {MilkCake sweetMilkCake = new SweetMilkCake();sweetMilkCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}h)具体产品三ChocolateFactory.java:package net.xsl.ordercake.product;public class ChocolateFactory {private String cakeType;public ChocolateFactory(String cakeType){this.cakeType = cakeType ;}public void createCake(){try{if (cakeType.equals("牛奶巧克力")){ChocolateCake milkChocolateCake = new MilkChocolateCake();milkChocolateCake.show();}else if (cakeType.equals("黑巧克力")) {ChocolateCake darkChocolateCake = new DarkChocolateCake();darkChocolateCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}(六)蛋糕工厂(简单工厂模式):a)水果蛋糕:i.FruitFactory.java(第五项构造蛋糕中已贴出):ii.接口类FruityCake.java:package net.xsl.ordercake.product;public interface FruityCake {public void show();}iii.实现接口:StrawberryCake.java:package net.xsl.ordercake.product;public class StrawberryCake implements FruityCake{ public void show() {System.out.println("生产了一个草莓水果蛋糕");}}GrapeCake.java:package net.xsl.ordercake.product;public class GrapeCake implements FruityCake{public void show() {System.out.println("生产了一个葡萄水果蛋糕");}}b)牛奶蛋糕:kFactory.java(第五项构造蛋糕中已贴出):ii.接口类MilkCake.java:package net.xsl.ordercake.product;public interface MilkCake {void show();}iii.实现接口:SweetMilkCake.java:package net.xsl.ordercake.product;public class SweetMilkCake implements MilkCake{ public void show() {System.out.println("生产了一个甜奶蛋糕");}}DoubleMilkCake.java:package net.xsl.ordercake.product;public class DoubleMilkCake implements MilkCake{public void show() {System.out.println("生产了一个双层鲜奶蛋糕");}}c)巧克力蛋糕:i.ChocolateFactory.java(第五项构造蛋糕中已贴出):ii.接口类ChocolateCake.javapackage net.xsl.ordercake.product;public interface ChocolateCake {void show();}iii.实现接口:DarkChocolateCake.java:package net.xsl.ordercake.product;public class DarkChocolateCake implements ChocolateCake{public void show() {System.out.println("生产了一个黑巧克力蛋糕");}}MilkChocolateCake.java:package net.xsl.ordercake.product;public class MilkChocolateCake implements ChocolateCake{public void show() {System.out.println("生产了一个牛奶巧克力蛋糕");}}六、程序运行截图七、实验总结本次实验的实现过程中,对有些模式理解还不是很深刻,后来通过翻阅教科书,研究它的示例程序,还有老师的ppt,其中最重要的是它的类图,最终使用了出来,并把它和其他模式结合在一起。

经过一个学期的学习请结合本次大作业谈谈你对设计模式的理解及想法

经过一个学期的学习请结合本次大作业谈谈你对设计模式的理解及想法

经过一个学期的学习请结合本次大作业谈谈你对设计模式的理解及想法我对设计模式的理解和想法是,设计模式是一种解决软件设计问题的经验总结,是在实践中产生的一套被广泛接受和验证的设计思想和解决方案。

通过使用设计模式,我们可以提高代码的可读性、可维护性和可扩展性,从而更好地实现软件需求和目标。

在本次大作业中,我选择了观察者模式作为设计模式的实践应用。

观察者模式是一种对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。

通过观察者模式,我们可以在对象之间建立松散耦合的关系,使得对象的改变不会影响到其他对象。

在我的设计中,我以一个新闻发布系统为例,观察者模式的被观察者是新闻发布者,观察者是订阅新闻的用户。

当新闻发布者发布新闻时,所有订阅了这个新闻类别的用户都会收到相应的通知,并在自己的页面上显示出来。

通过实践观察者模式,我深刻理解到设计模式的价值和作用。

首先,观察者模式使得系统的耦合性极大地降低。

发布者和订阅者之间是通过接口进行通信的,彼此之间没有直接的依赖关系。

这样一来,发布者和订阅者可以独立地进行扩展和变化,不会相互干扰。

其次,观察者模式提高了系统的灵活性和可扩展性。

由于发布者和订阅者之间是松散耦合的关系,所以可以很容易地增加新的订阅者或者发布者,而不需要对原有的代码进行修改。

再次,观察者模式更加符合面向对象的设计原则,尤其是依赖倒置原则和单一职责原则。

发布者和订阅者之间的关系是基于抽象而不是具体的实现,而且每个对象都只有一个职责,符合设计的可维护性和可测试性的要求。

设计模式是非常强大的工具,通过合理地运用设计模式,我们可以极大地提高软件的质量和可维护性。

然而,设计模式并不是万能的,在使用设计模式时需要有一定的把握和取舍。

应该根据具体的业务需求和软件环境来选择合适的设计模式,避免滥用设计模式导致代码过于复杂和难以维护。

此外,设计模式并非一成不变的,它是根据实践不断总结和演化的。

软件设计模式大作业

软件设计模式大作业

体系结构和设计模式的说明系统名称:商店管理系统1.体系结构:MVC体系结构。

2.软件设计模式:单例模式,观察者模式,适配器模式。

单例模式:实现注册。

观察者模式:添加商品显示在列表。

适配器模式:实现密码的加密。

1.本系统采用的体系结构为MVC体系结构。

2.设计模式:包括(单例模式,适配器模式,观察者模式)(1)单例模式本项目在注册时候实现单例模式,该单例模式采用的是懒汉式的单例模式。

当在登录界面,点击“注册”按钮时,会使用单例模式的方法getInstance()生成了一个注册界面。

单例实现的类为SingleRegisterStage(),设定一个公开访问点,实现注册界面的打开,而且是单线程的方式,只能打开一个界面。

视图层:Login.fxml控制层:LoginController.java注册实现类:SingleRegisterStage.java界面显示:(2)适配器模式适配器模式主要用在注册对密码的加密,以及在密码修改的时候进行密码的加密。

实现的三个类分别为适Adaptee(适配器者类),Target(目标抽象类),Adapter(适配器类)。

而在Adaptee类定义为final类,只能使用对象适配器实现;Target目标类中包含了抽象方法doEncrypt(),客户端针对抽象类Target中进行编程,在客户端代码中调用了Target的doEncrypt()实现加密;Adapter类是适配器类,在该类的构造器函数中实例化Adaptee对象,Adapter和Adaptee是组合关系。

适配者类:Adptee.java目标抽象类:Target.java适配器类:Adapter.java控制层:RegisterController.java(3)观察者模式观察者主要是在添加商品的时候,显示在列表中实现的。

通过添加观察者,通知观察者,然后将结果显示在列表上。

有四个类分别为Subject(目标类),ConcreteSubjest(具体目标类),Observer(观察者),ConcreteObserver(具体观察者)。

建筑设计大作业

建筑设计大作业

在进行建筑设计大作业时,你需要考虑以下几个方面:
1. 确定主题和范围:
-选择一个具体的建筑设计主题,可以是住宅、商业建筑、公共建筑等。

-确定设计项目的规模和范围,包括建筑物的大小、用途、功能等。

2. 调研和分析:
-进行相关领域的调研和分析,包括类似建筑案例、现行设计理念和技术、城市规划、环境影响等。

-还要对当地的法律法规、土地利用规划、环保要求等进行了解。

3. 设计概念和方案:
-制定建筑设计的总体概念,包括建筑风格、结构形式、空间布局等。

-提出不同的设计方案,并进行评估和比较,选择最合适的方案。

4. 技术细节和施工图纸:
-开展详细的建筑方案设计,包括平面布置、立面设计、结构设计、设备设置等。

-准备施工图纸,包括平面图、立面图、剖面图、细部图等。

5. 可持续性和环保考虑:
-在设计过程中考虑可持续发展和环保要求,包括节能设计、绿色材料使用、自然通风、采光设计等。

6. 建筑模型和效果图:
-制作建筑模型或三维效果图,以直观展示设计成果和设计理念。

7. 编写设计说明书和报告:
-撰写设计说明书,详细阐述设计思路、技术细节、材料选取等。

-撰写设计报告,对整个设计过程进行总结和回顾。

8. 展示和答辩:
-准备设计成果的展示材料,包括海报、幻灯片等。

-参加设计成果的答辩,积极回答评委的问题,展示设计的专业性和可行性。

以上是进行建筑设计大作业时可能涉及的一些方面,具体内容和要求可能会根据你所在的学校、专业和课程而有所不同。

建议你按照老师或课程要求,结合实际情况制定详细的计划和安排。

祝你在大作业中取得成功!。

华工课程设计大作业

华工课程设计大作业

华工课程设计大作业一、教学目标本课程的教学目标是使学生掌握XX学科的基本概念、原理和方法,能够运用所学知识解决实际问题。

具体包括以下三个方面的目标:1.知识目标:学生能够准确地掌握XX学科的基本概念、原理和方法,了解该学科的发展趋势和应用领域。

2.技能目标:学生能够运用所学知识解决实际问题,具备一定的实践操作能力。

3.情感态度价值观目标:学生能够积极地参与学习,形成对XX学科的兴趣和好奇心,培养良好的学习习惯和团队合作精神。

二、教学内容根据课程目标,教学内容主要包括以下几个部分:1.XX学科的基本概念:介绍XX学科的基本定义、特点和意义,使学生对该学科有一个整体的认识。

2.XX学科的基本原理:讲解XX学科的核心原理,并通过实例进行说明,帮助学生理解和掌握。

3.XX学科的应用方法:介绍XX学科在实际问题中的应用方法,引导学生学会运用所学知识解决实际问题。

4.学科发展动态和趋势:介绍XX学科的最新研究成果和发展趋势,激发学生的学习兴趣和动力。

三、教学方法为了实现教学目标,将采用以下几种教学方法:1.讲授法:通过教师的讲解,使学生掌握XX学科的基本概念和原理。

2.讨论法:学生进行小组讨论,促进学生之间的交流和思考,提高学生的理解能力。

3.案例分析法:通过分析实际案例,使学生学会将所学知识应用于解决实际问题。

4.实验法:学生进行实验操作,培养学生的实践能力和科学思维。

四、教学资源为了支持教学内容和教学方法的实施,将选择和准备以下教学资源:1.教材:选用权威、实用的教材,为学生提供系统、全面的学习材料。

2.参考书:推荐一些相关的参考书籍,丰富学生的知识体系。

3.多媒体资料:制作教学PPT、视频等多媒体资料,提高学生的学习兴趣和效果。

4.实验设备:准备充足的实验设备,确保学生能够进行实验操作,培养实践能力。

五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面、客观地评价学生的学习成果。

1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解能力。

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

设计模式大作业 (总分:20分)
问题1. 请简述什么是里氏代换原则? (5分)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。

严格表述如下:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1代换o2时,程序P的行为没有变化,那么类型S是类型T的子类型。

这个定义比较拗口且难以理解,因此我们一般使用它的另一个通俗版定义:所有引用基类的地方必须能透明的使用其子类的对象。

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

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

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

问题2. 阅读以下代码,并回答问题:(7分)
public class MyOrderedCollection {
protected List<Integer> list = new ArrayList<>();
public void addElement(Integer i) {
list.add(i);
}
public Integer getElement(Integer index) {
return list.get(index);
}
}
public class MyOrderedAndSortedCollection extends MyOrderedCollection { public void addElement(Integer i) {
super.addElement(i);
Collections.sort(super.list);
}
public class LSP1 {
public static void main(String args[]) {
MyOrderedCollection collection1 = new MyOrderedCollection();
MyOrderedCollection collection2 = new MyOrderedAndSortedCollection();
int a = 10, b = 5;
collection1.addElement(a);
collection1.addElement(b);
collection2.addElement(a);
collection2.addElement(b);
PrintSecondElement(collection1);
PrintSecondElement(collection2);
}
public static void PrintSecondElement(MyOrderedCollection collection) { System.out.println("The second element is :"
+ collection.getElement(1));
}
}
1) 以上代码设计是否符合里氏代换原则?(请明确说明符合,还是不符合) (2分)
答:不符合
2) 若你认为符合,请简要说明理由;若你认为不符合,也请简要说明理由。

(5分)
答:
由里氏替换原则,子类能继承扩展父类功能,不能修改父类原来的功能。

该函数
addElement(Integer i)在继承的时候,父类的功能改变了,导致父类出现的地方,子类不一定会出现。

问题3. 请简要描述在什么状况下,问题2中的代码会造成麻烦? (4分)
答:分别输出第二个元素,答案是The second element is :5;The second element is :10。

类MyOrderedAndSortedCollection继承类MyOrderedCollection,直接修改了父类MyOrderedCollection的addElement方法,违背里氏替换原则,不能有用的运用子类的对象。

问题4. 如果你想避免问题3中出现的麻烦,你会如何修改问题2中的代码设
计以使得其遵守里氏代换原则? (4分)
答:将子类修改成如下
public class MyOrderedAn dSortedCollection extends MyOrderedCollection { public void addElement(Integer i) {
super.addElement(i);
}
public void stord(){
Collections.sort(super.list);
}。

相关文档
最新文档