面向对象分析实例
- 格式:doc
- 大小:20.50 KB
- 文档页数:1
面向对象设计原则实验报告1.1实验目的1. 通过实例深入理解和掌握所学的面向对象设计原则。
2.熟练使用面向对象设计原则对系统进行重构。
3.熟练绘制重构后的结构图(类图)。
1.2实验内容1.在某绘图软件中提供了多种大小不同的画笔(Pen),并且可以给画笔指定不同颜色,某设计人员针对画笔的结构设计了如图1-1所示的初始类图。
通过仔细分析,设计人员发现该类图存在非常严重的问题,即如果需要增加一种新的大小或颜色的笔,就需要增加很多子类,例如增加一种绿色的笔,则对应每一种大小的笔都需要增加一支绿色笔,系统中类的个数急剧增加。
试根据依赖倒转原则和合成复用原则对该设计方案进行重构,使得增加新的大小或颜色的笔都较为方便,请绘制重构之后的结构图(类图)。
2.在某公司财务系统的初始设计方案中存在如图1-2所示的Employee类, 该类包含员工编号(ID),姓名(name),年龄(age).性别(gender)、薪水(salary)、每月工作时数( workHoursPerMonth),每月请假天数(leaveDaysPerMonth)等属性。
该公司的员工包括全职和兼职两类,其中每月工作时数用于存储兼职员工每个月工作的小时数,每月请假天数用于存储全职员工每个月请假的天数。
系统中两类员工计算工资的万法也不一样,全职员工按照工作日数计算工资﹐兼职员工按照工.作时数计算上资﹐内此在 Employee 类中提供了两个方法calculateSalaryByDays()和calculateSalaryByHours(),分别用于按照大数和时数计算工资,此外,还提供了方法displaySalary()用于显示工资。
试采用所学面向对象设计原则分析图1-2中Employee类存在的问题并对其进行重构绘制重构之后的类图。
3.在某图形界面中存在如下代码片段,组件类之间有较为复杂的相互引用关系:如果在上述系统中增加一个新的组件类,则必须修改与之交互的其他组件类的源代码,将导致多个类的源代码需要修改。
《面向对象分析与设计》实验参考资料目录一、课程编号 (2)二、课程类型 (2)三、本课程的地位、作用与任务 (2)四、课程基本要求 (2)五、实验安排 (2)实验1:实验准备 (2)1.实验器材 (2)2.rational rose安装步骤 (3)实验2:用例分析与设计 (3)1、实验目的 (3)2、实验内容 (3)3、实验步骤 (3)4、实验报告要求 (8)实验3:类图的设计 (8)1.实验目的 (8)2.实验内容 (8)3.实验步骤 (8)实验4:状态图 (9)1.实验目的 (9)2.实验内容 (9)3.实验步骤 (9)实验5:时序图 (15)1.实验目的 (15)2.实验内容 (15)3.实验步骤 (15)实验6:协作图 (21)1.实验目的 (21)2.实验内容 (21)3.实验步骤 (21)实验7,8:综合设计实验 (24)1.实验目的 (24)2.实验内容 (24)3.实验步骤 (24)六、教材 (25)七、成绩考核办法 (25)八、附A:完整UML建模过程例子 (25)面向对象分析与设计一、课程编号本科软件工程二、课程类型课程类型:必修课。
适用专业:软件工程试验学时:10~24学时三、本课程的地位、作用与任务计算机软件建模技术现在越来越广泛的应用于软件工程中。
《面向对象系统分析设计》课程实验的目的是为了使学生在课程理论学习的同时,通过在一个实践的环境下,实际学习软件统一建模语言,对软件建模技术有一个初步的了解及认识。
通过本指导书中的各个实验,学习掌握对一般面向对象系统建模的方法与技术。
总之,通过上述实验环节,使学生加深了解和更好地掌握课程教学大纲要求的内容。
四、课程基本要求1、学生应根据每个上机试验的任务和教师所提的要求,上机前准备好上机内容。
2、上机时要针对一个实际的案例进行分析,画出不同的阶段UML图。
3、上机结束后应按时提交试验报告,对于上机未完成部分,应该下机后利用课余时间完成。
面向对象设计例子【篇一:面向对象设计例子】本文链接、面向对象程序设计有5条基本设计原则,分别是:单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则和liskov替换原则,但对于初学者来说,这5条基本设计原则可能有点难以理解。
下面我以battleheart(战争之心)这款角色扮演类的手机游戏(已从ios移植到android了)为背景,分析一下其中的类的设计(注:以下为个人的设计想法,因此可能与这款游戏真实的设计有所不同)。
这款游戏中可以操作4个英雄,英雄种类分别有:战士、法师、牧师、刺客等。
每个英雄都拥有自己的技能、都能够装备武器、衣服、戒指等。
其中,无论是战士、法师或者其他种类的英雄,他们都有一些共同的属性,如:hp、atk(攻击力)、def(防御力)、pos(位置)、人物形象、各种装备、各种技能等因此,我们可以设计出一个公共的英雄类,如下图所示:注:这里只列出部分属性,可根据需要增加或减少。
注:#代表为protected –代表private +代表public而每种英雄,则又都有各自不同的地方。
如:攻击方式不同,其中战士是近身攻击、法师是远程攻击、牧师是加血等。
因此,不同种类的英雄,攻击方式的实现也就不一样。
所以,我们可以给英雄增加一个抽象方法——攻击,然后由不同的子类来作对应的实现,如下图所示:游戏中,每个英雄都可以装备一些武器之类的道具,而道具又分很多种类,一类是可以被装备的,一类是可以使用的消耗品。
由于本游戏中只有可以被装备的道具种类,因此道具的设计比较简单。
道具的属性有:形象(即我们看到的样子)、买入价格、卖出价格等。
又因为武器是加攻击力这类伤害属性的,而衣服则是加防御力这类减伤属性的,戒指是加一些特殊属性的。
所以如果把这些属性都放在道具类中,道具类的属性就会显得很庞大。
再者当道具为武器时,衣服相关的属性相对来说是没有意义的。
因而我们可以把武器、衣服、戒指等作为道具的子类,再加入自己需要的属性。
《UML2面向对象分析与设计》综合案例:员工考勤系统作业评分实施细则一、第四章作业(用例图和用例文档)1. 评分档次用例图和用例文档分别按照满分10分计算,以此作为评分标准,基本的评分准则如下:●一档(10分):图形(文本)条理清楚,无任何明显错误●二档(8-9分):图形/文本清楚,存在个别错误●三档(6-7分):图形/文本一般,存在一定的错误●四档(5分):图形/文本条理不清,存在致命错误或错误数过多一般情况下按错别个数扣分,每个错误按严重程度扣0.5、1、2分,最终成绩向上取整;同类错误不重复扣分。
2. 参考答案作业答案部分仅供参考,学生的作业可能会多种多样,具体按照第三部分的典型错误扣分,用例图:用例文档:员工(含小时工和普通员工)相关用例无前置条件员工已正确登录到该系统后置条件无(将在下次迭代中确定)涉众利益员工:准确地维护自己的考勤信息公司:要求员工的信息准确基本路径1—添加新的考勤1.1、用例起始于用户需要记录新的考勤信息1.2、系统显示当前日期和时间,并提醒用户该时间即为用户的上班时间1.3、用户确认该信息1.4、系统记录当前日期和时间,并将其作为用户考勤信息的上班时间2—提交考勤信息2.1、任何时刻用户都可以提交自己的考勤信息2.2、系统查询用户上班时的考勤记录(E-1)2.3、系统记录当前的日期和时间,作为用户考勤信息的下班时间2.4、系统显示用户今天完整的考勤信息2.5、用户确认提交考勤信息2.6、系统保存考勤信息,并将考勤信息的状态改为“已提交”(D-1)备选路径E-1 如果系统没有找到用户上班时的考勤信息,则用例终止;用户可以通过项目经理为其添加上班的考勤信息数据需求A-1 考勤信息主要包括:用户名、日期、上班时间、下班时间、状态D-1 考勤信息的状态有:“新考勤”(只有上班时间,没有下班时间的考勤信息)、“已提交”(有完整的上下班时间,但还没有进行工资结算的考勤)、“已完成”(已结算工资的考勤)业务规则B-1 作为用户考勤信息的上下班时间由系统自动获取,不允许用户编辑B-2 状态为“已提交”的考勤信息不允许普通用户进行任何操作;非功能需求无设计约束无待解决问题无参与者时间、项目管理数据库(外部系统)相关用例无前置条件无后置条件无(将在下次迭代中确定)涉众利益员工:…(包括临时工、普通员工、销售人员)公司:…基本路径—计算普通员工和销售人员工资1.用例起始于系统时间到达每月末晚上,需要计算普通员工和销售人员工资(E-1);2.系统查询所有的普通员工和销售人员的个人信息(D-1);3.对于每一个员工(普通员工、销售人员):3.1.根据员工的类别获得其考勤信息或订单信息(E-2);3.1.1.如果是普通员工,则获得本月的考勤信息(D-2);3.1.2.如果是销售人员,则获得本月的销售信息(D-3);3.2.系统从项目管理数据库中获得员工的工资级别信息(E-3);3.3.系统根据员工的考勤信息(或销售信息)和工资级别信息计算该员工的工资,保存;4.计算完成后,系统产生一个提醒信息,以便于项目经理确认备选路径E-1—计算临时工工资1. 用例起始于系统时间达到每个周末的晚上,需要计算临时工工资2. 系统查询所有临时工的个人信息3. 对于每一个临时工:3.1. 获得员工的考勤信息3.2 从项目管理数据库中获得员工的工资级别信息;3.3 系统根据员工的考勤信息和工资级别信息计算该员工的工资,保存;4. 计算完成后,系统产生一个提醒信息,以便于项目经理确认E-2 如果找不到该员工的考勤信息或订单信息,则记录相关日志,并转回3计算下一个员工E-3 如果无法获得员工工资级别信息,则记录相关日志,并转回3计算下一个员工数据需求D-1. 员工信息=员工编号+员工姓名D-2 考勤信息参见“登记考勤”用例D-3 订单信息参见“登记订单”用例业务规则暂不明确非功能需求暂不明确设计约束3. 典型错误情况3.1 用例图部分3.1.1 参与者本系统中包含的参与者有:小时工、普通员工、销售人员、项目经理、项目管理数据库、时间,其中由于小时工和普通员工有关考勤的处理细节完全相同,因此为了便于简化和复用,可将他们统一合并为员工(不合并也可以,不算错误),但不能和销售人员合并,因为销售人员没有考勤信息,而是登记订单信息,需要明确区分。
9.1 面向对象技术概述9 面向对象的需求分析方法二者的本质区别• 面向过程的结构化系统 = 功能 + 数据 • 面向对象的系统 = 对象 + 消息9 面向对象的需求分析方法二者的本质区别银行账户对象 存款 取款 利息结算 账户 余额 存 款 账户 余额 利息结算 外部消息 取 款9 面向对象的需求分析方法面向对象方法的发展历史• 初始阶段• 1960’s:Simula编程语言 • 1970’s:Smalltalk编程语言• 发展阶段• 1980’s:理论基础,许多OO 编程语言(如C++, Objective-C等)• 成熟阶段• 1990’s:面向对象分析和设计方法(Booch, OMT等), Java • 1997:OMG 组织的统一建模语言(UML) • 逐渐替代了传统的结构化方法9 面向对象的需求分析方法面向对象的软件工程• 面向对象分析(Object Oriented Analysis, OOA)• 分析和理解问题域,找出描述问题域和系统责任所需的类及 对象,分析它们的内部构成和外部关系,建立OOA 模型。
• 面向对象设计(Object Oriented Design, OOD)• 将OOA 模型直接变成OOD 模型,并且补充与一些实现有关 的部分,如人机界面、数据存储、任务管理等。
• 面向对象编程(Object Oriented Programming, OOP)• 用一种面向对象的编程语言将OOD 模型中的各个成分编写成 程序,由于从OOA→OOD→OOP实现了无缝连接和平滑过 渡,因此提高了开发工作的效率和质量。
9 面向对象的需求分析方法面向对象的软件工程现实世界OOA结构化分析OOD结构化设计OOP结构化编程可执行软件系统9 面向对象的需求分析方法OO中的喷泉过程模型• 喷泉模型:• 在OO开发过程中,各阶段之间形 成频繁的迭代; • OO各阶段均采用统一的“对象”概 念,各阶段之间的区分变得不明 显,形成“无缝”连接,从而容易实 现多次反复迭代。
Python面向对象课程简介培训对象对Python面向对象编程感兴趣已掌握基础的Python面向过程编程用Python自主开发大、中型应用系统有未来从事Python相关开发职业目标的技能目标了解面向对象编程的基本知识掌握Python语言中类的定义与使用方法掌握Python中类的属性与方法及其应用掌握Python中类继承与多态、方法重载会用继承和组合来完成项目的面向对象分析和代码实现怎样学习 1.掌握Python基本语法及顺序、选择、循环基本程序的编写技能2.注意掌握面向对象的基础知识3.听课及时做笔记,供复习4.课后多做实践,理论联系实际才是最好的学习方式5.加入一些群、论坛等,帮人解决问题,提升自己面向对象与面向过程产生背景科学计算为目标的必然产物鸡兔同笼1.先假设全部为鸡(兔),计算出腿数2.然后算出腿数量差3.得出鸡(兔)数量4.计算出另一种动物的数量软件应用领域的扩张和系统膨胀之后应运而生编程方法自顶向下自底向上代码主体结构程序=数据(变量)+算法(函数/过程)程序=对象+交互数据操作主体由函数/过程进行加工与展现在对象的方法中加工与展现模拟方法通过函数/过程操纵表现世界的数据与状态把世界描绘成具有主动性的对象之间交互编程思维搞清处理数据的步骤面向对象分析运行效率较高稍低面向对象入门对象编程体验一款简单自动运行小游戏模拟:在一维的地图上,有一只虫子和一只蚂蚁。
每一次他们都走过一个-3,-2,2,3个随机单位的距离(选定走法,若达 到地图边界则放弃移动)。
当蚂蚁、虫子处于同一位置时,蚂蚁吃掉虫子,程序结束。
PO虫子的初始位置蚂蚁的初始位置进入循环(条件为蚂蚁和虫子不在同一位置)依照规则,蚂蚁和虫子移动位置直到蚂蚁和虫子走到同一位置,程序结束OO游戏中的对象有:地图、虫子、蚂蚁地图是一维的,只需要记录虫子和蚂蚁的位置蚂蚁和虫子知道自己的位置蚂蚁和虫子能按规则移动定义地图、蚂蚁、虫子三个类主程序中实例化它们,并通过对象间的交互来完成游戏的模拟理解对象对象可以指自然界中的任何事物计算机为解决某个领域问题所使用的事物(自然界中的事物的模型化)事物(对象)具有自身的特征或能力计算机中的对象具有解决问题所需的特征或能力对象优越性封装将模型的特征和能力打包在一起模型的改变由模型自身来完成,就像自然界的事物一样隐藏模型的细节,外界只能使用他,而不必/不能改变他继承符合自然界的分类规律快速的代码重用多态子类可以继承父类的特征与能力,还可以通过自定义来修改其特征与能力鸭子类型(duck typing)1组合一个模型可以由其他的模型组成定义和使用类最简类定义类实例化类与实例之间关系定义类就是建立模型(模子/印章)实例化类就是建立真实事物(产品/印章印出的图案)有特征和能力的类特征/属性,是类自身包含或知道的数据能力,以方法体现,是类具有能动性的体现实例化步骤调用__new__()方法创建实例__new__()方法自动从object继承调用__init__()方法对其初始化__init__()方法在类中定义添加类说明(docstring)紧跟类名行之后,以三引号包围的字符串查看类说明类名.__doc__help(类名)新式类与经典类Python 2.x版本默认为是经典类继承object为新式类Python 3.x版本统一为新式类不用继承object区别经典类继承为深度优先新式类继承为广度优先课后思考类和实例是什么关系?类的属性和方法分别代表什么?类实例化的基本步骤是什么?描述对象的特征实例属性类被实例化以后才会具有的属性一般在__init__()方法中创建并初始化直接使用即定义:self.<属性名>引用方法:self.<属性名>self用来代表类的实例的类外用实例名.属性名方式定义和引用相同类的不同实例其实例属性是不相关的一般不建议在__init__()方法之外中创建和初始化实例属性一般不推荐类外定义和修改,修改可以单独定义方法类属性类定义后就存在,而且不需要实例化类属性使得相同类的不同实例共同持有相同变量私有属性不提供限制属性访问的关键字(无法限制类的各种属性在类外直接访问)使用__开头的变量名加以标志,只有类对象自己能访问使用_开头的变量名加以标志,应该只有类对象及其子类能访问(非强制性)特殊属性保存对象的元数据__doc____name____dict____module____base__作业定义一个类Box,具有实例属性长度(length)、宽度(width)、高度(height)。
一、S G实例研究:需求阶段Martha Stockton Greengage在逝世后,留下20亿美元的财富给慈善事业。
她的遗嘱中还特别要求设立Martha Stockton Greengage基金(MSG),以帮助年轻夫妇购买他们自己的房子。
为了减少操作费用,MSG的托管人正在研究计算机化问题。
由于托管人中没有人有计算机方面的经验,他们决定委托一个小型软件组织来实现一个实验性项目,即利用计算机执行计算来决定每星期可用多少钱来购买房子。
开发组成员访问了一些MSG管理员和相关职员,以了解基金会的工作方式。
在以下条件下,MSG提供100%抵押款来购买房子:1)结婚夫妇至少已经合法结婚一年,但未超过10年。
2)双方都在职有薪水。
特别是,必须提供双方在前一年全日工作至少48个星期的证据。
3)房子的价格必须比过去12月中那一地区公布的中等房价要低。
4)以30年分期付款形式偿还的90%抵押款超过他们共同收入的28%,或者他们的存款不够付清房价的10%加7000美元费用(7000美元是有关附加费用的估计值)。
5)基金会有足够的资金购买房子,这将在下面详细描述。
如果申请被批准,则夫妇俩在今后的30年中,每星期必须付给MSG的数额计算如下(每周):1)偿还资金是购买房价的1/1560。
2)应付利息是当前抵押余额4%的1/52。
3)契据保存费用是每年财产税和房产所有人每年保险费总和的1/52。
4)每星期付给MSG的费用数额就是(1)、(2)、(3)项的总和。
5)如果4)项超过了家庭每星期收入的28%,则MSG将以补助形式付余下的差额。
因此,抵押款每星期都要偿还,但夫妻俩所付款永远不会超过他们总收入的28%。
夫妇必须每年给MSG提供一份收入所得税收据的副本,以便MSG有前一年收入的凭证。
另外,夫妇也可将工资单副本作为目前总收入的凭证。
因此,夫妇必须偿付的抵押款数额每星期都可能改变。
MSG确定是否有资金批准一个抵押申请的过程如下:1)在每星期的一开始,计算总投资的预计年收入,并除以52。
面向对象的分析过程摘要分析了面向对象技术应用于仿真领域的种种优点,亦即我们选择采用面向对象的方法进行改造的原因。
一些面向对象方法存在的不足。
关键词:仿真,面向对象,岸边集装箱起重机,训练器面向对象的开发方法是以对象作为最基本的元素,它是分析问题、解决问题的核心。
面向对象=对象(Object)+分类(classification)+继承(inheritance)+通过消息的通信(communication with messages)从下图中我们可以看出,面向对象的开发方法明显不同。
面向对象的仿真为仿真人员提供了开发模块化可重用的仿真模型的工具,它把系统看成由相互作用的对象所组成,而对象则往往表示现实系统中的真实实体。
从而提高了仿真模型的可理解性、可扩充性和模块性,并且便于实现仿真与计算机图形和人工智能的结合。
采用面向对象的方法,原因如下:1.可理解性面向对象仿真对设计者、实现者,以及最终用户来说都改进了仿真的可理解性。
因为仿真系统中的对象往往直接表示现实系统中的真实实体,这些实体在面向对象的仿真系统中可以用外观上类似于人们熟悉的实际系统的对象的图形或图像来表示,用户可以通过图形界面与仿真模型进行交互,利用图形或图像来直接建立仿真模型,这对于熟悉实际系统的用户来说是很容易理解的。
2.可重用性和可扩充性在面向对象的仿真中,可以建立起一个模型库用以保存以前建立的模型,模型库中的模型可以作为建立新模型的可重用构件,通过面向对象技术内在的继承机制可以容易地和系统地修改现有的对象(类)以创建新的对象。
并且可以加入现有的类库中。
类库提供了仿真建模所需要的一般设施。
通过修改现有的类,可以建立各种应用中所需要的特殊对象。
3.模块性面向对象的仿真是模块化,特殊的过程来寻找相应的信息,不会影响其它的对象。
4.图形用户界面对象作为模块,对象的所有信息都保存在该对象中,在面向对象的仿真系统中往往表示实际系统中的真实实体,因而在系统中可以用相似的图形或图像来表示,因此更便于建立非常直观的图形用户界面,用户可以直接在屏幕上建立系统的图形概念,直观地构造仿真模型。
案例4-1 super访问父类成员变量一、案例描述1、考核知识点编号:029004003名称:super关键字2、练习目标➢掌握使用super关键字访问父类成员变量的方法3、需求分析子类可以继承父类的非私有成员变量,如果在子类中修改了继承自父类的成员变量的值,再想要访问父类的该成员变量时,可以通过super.成员变量来实现。
为了让初学者熟悉super关键字的用法,本案例将分别设计Fu类及其子类Zi,并在Zi类的方法中使用super关键字访问Fu类的成员变量。
4、设计思路(实现原理)1)编写一个Fu类,在类中定义无参构造和一个初始值为20的num成员变量。
2)Zi类继承Fu类,在子类中对num值进行了修改,同时在子类中定义无参构造和一个无返回值的method()方法,method()方法中使用super关键字调用了Fu类的num成员变量。
3)定义测试类Example03。
二、案例实现1、编写Fu类及其子类Zi,在Zi类中使用super关键字调用Fu类成员变量,代码如下class Fu {Fu() {}int num = 20;}class Zi extends Fu {Zi() {}int num = 30;// 修改num的值void method() {System.out.println("method");// super关键字调用父类成员变量System.out.println("Fu类中num值为:" + super.num);System.out.println("Zi类中num值为:" + num);}}2、定义测试类Example03,代码如下:class Example03{public static void main(String[] args) {Zi z = new Zi();z.method();}}运行结果如图4-3所示。
⾯向对象分析过程案例实战原始需求描述如下:某公司鉴于业务和员⼯的快速发展,为了提升整体⼯作效率,公司准备开发⼀套员⼯报账系统,取代原来的⼈⼯处理⽅式,更加⽅便的服务于员⼯⽇常的账务操作。
财务部门能够通过账务系统定期向各部门负责⼈反映账务统计情况,并设置和维护相关额度准则。
系统应该具有基于先进技术的操作界⾯。
这段描述⾥包含的业务⽬标⼤致有⼆:1. 为员⼯提供账务的⾃动化办理,提⾼办事效率,⽅便员⼯。
2. ⽅便财务部门管理好账务信息。
这些业务⽬标⼀般在项⽬的招标书⾥都有相关的描述,也可以由开发⽅整理得出。
之所以这⾥要把业务⽬标列出来,是因为我所采取的⽅法⾥,业务⽬标是进⾏需求分析的第⼀步,接下来的推导过程和业务模型的建⽴都是根据业务⽬标开始的。
整理出了业务⽬标后,接下来先不要⼀头扎进具体的业务流程和业务细节之中去,应该先把涉众找出来,整理出⼀份涉众分析报告,涉众就是和这个项⽬相关的⼈。
也不要就去考虑技术实现细节,要⽤什么先进的技术,界⾯如何美观,性能如何优越等等,虽然这些确实重要,但是相⽐起来,忠实的实现涉众的期望,满⾜涉众的需求才是最为重要,也是⼀个项⽬成败的关键。
在实际的项⽬中,我们可以通过需求调研找出相关的涉众,这⾥我就直接列出本案例的涉众分析报告:员⼯:公司的正式录⽤雇员;期望:通过⽹上办理账务业务申请,计算机控制流程。
部门经理:部门负责⼈,负责审核员⼯提交的申请;期望:⽅便审核操作,通过计算机代替原来的⼿⼯审核⽅式。
公司主任:公司负责⼈,负责2次审核员⼯提交的申请;期望:⽅便审核操作,通过计算机代替原来的⼿⼯审核⽅式,界⾯友好易⽤。
财务主任:公司财务部门负责⼈,负责发放报账款项;期望:通过计算机转账的⽅式替代原来的⼈为付款⽅式。
以上的涉众分析报告是很简单的了,在实际稍微复杂些的项⽬中要下功夫好好整理清楚⼀份完整的⽂档才是,因为接下来的业务⽤例获取⼯作也是在此基础上展开的。
这⾥先罗嗦下业务⽤例和平时开发中的我们开发⼈员从项⽬经理或者需求⼈员⼿中拿到的需求⽂档中的⽤例什么区别。
面向对象的多态什么是多态在面向对象编程中,多态(Polymorphism)是一个重要的概念。
它指的是同一个方法可以根据不同的对象产生不同的行为。
换句话说,多态允许我们使用统一的接口来处理不同类型的对象。
多态是面向对象编程的三大特性之一,其余两个特性是封装和继承。
封装是指将数据和方法包装在一个对象中,继承是指一个类可以继承另一个类的属性和方法。
多态使得程序更加灵活,可扩展性更强。
生活中的多态示例为了更好地理解多态,我们可以通过生活中的一些例子来解释它。
1. 动物发声想象一下,你在一座动物园里散步。
你经过了一些动物的笼子,每个动物都在发出自己独特的声音。
狗在汪汪叫,猫在喵喵叫,鸟在唧唧鸣。
尽管它们发出的声音不同,但它们都是动物,都具有发声的能力。
在这个例子中,动物园可以被看作是一个类,而每个动物则是该类的实例。
类定义了动物的共同属性和方法,而每个实例则可以根据自己的特性来表现不同的行为。
这就是多态的体现。
2. 图形的面积计算假设你正在画一些图形,包括圆形、矩形和三角形。
你需要计算每个图形的面积。
不同的图形有不同的计算公式,但它们都有一个共同的方法——计算面积。
在这个例子中,每个图形可以被看作是一个类,而计算面积的方法则是这个类的一个公共方法。
每个图形类可以根据自己的特性实现不同的计算面积的方式。
当你调用计算面积的方法时,程序会根据具体的图形类型来执行相应的计算。
多态的实现方式在面向对象编程中,实现多态有两种常见的方式:继承和接口。
1. 继承实现多态继承是面向对象编程中的一个重要概念,它允许一个类继承另一个类的属性和方法。
通过继承,子类可以重写父类的方法,从而实现多态。
以动物为例,我们可以定义一个基类 Animal,它有一个方法叫做 makeSound()。
然后我们定义几个子类,如 Dog、Cat 和 Bird,它们分别重写了 makeSound() 方法来发出不同的声音。
class Animal {public void makeSound() {System.out.println("Animal makes sound");}}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Cat meows");}}class Bird extends Animal {@Overridepublic void makeSound() {System.out.println("Bird chirps");}}public class Main {public static void main(String[] args) {Animal dog = new Dog();Animal cat = new Cat();Animal bird = new Bird();dog.makeSound(); // 输出:Dog barkscat.makeSound(); // 输出:Cat meowsbird.makeSound(); // 输出:Bird chirps}}在上面的例子中,我们定义了一个 Animal 类作为基类,然后定义了三个子类 Dog、Cat 和 Bird,它们都重写了 makeSound() 方法。
UML面向对象分析一.引言 (3)1.1背景 (3)1.2文档概述 (3)二.系统概述 (4)2.1要求 (4)2.2用户的特点 (4)三.需求划分 (5)3.1系统用例关系图 (5)3.2系统功能概述 (6)3.2.1取款 (6)3.2.2修改密码 (6)3.2.3查询余额 (6)3.2.4转账 (6)3.2.5打印账单 (7)3.2.6查询历史事务记录 (7)3.3系统功能模块 (7)3.4系统用例描述 (8)3.5用例的活动图 (12)3.6主要用例的时序图 (14)3.7系统类图 (15)3.8状态图 (16)3.9系统部署图 (17)一.引言1.1背景ATM自动柜员机(automatic teller machine)是银行在不同地点设置的一种小型机器,利用一张信用卡大小的胶卡上的磁带〔或芯片卡上的芯片〕记录客户的基本户口资料(通常就是银行卡,或称金融卡,或称提款卡),让客户可以透过机器进行提款、存款、转帐等银行柜台服务,大多数客户都把这种自助机器称为提款机。
中国大陆在1980年代末期才开始在深圳出现提款机,现在扩展至全国。
并且多数柜员机都已加入银联网络,只要是有银联标志的银行卡都可以通用,但收费与否则和发卡行的规定有关。
没有银联标志的卡只能在本行网络的柜员机上使用。
目前,国内已有大量自动柜员机,遍布于银行营业大厅、超市、商业机构、机场、车站、码头和闹市区。
因为ATM技术的高安全性和高速度,所以在我国的发展十分迅速,尤其在银行领域。
我国宽带网已初具规模,已建立成完整的电子商务安全认证体系。
几乎所有的银行都是采用ATM技术,主要用于各地区之间交换数据和ATM终端。
1.2文档概述ATM自动柜员机系统是由计算机控制的银行自动出纳系统,主要服务于活期储蓄,实现客户自助服务的电子化设备。
统一建模语言UML(Unified Modeling Language)是面向对象技术的一个重要应用,也是软件工程环境中对象分析和设计的重要工具。
java⾯向对象九个经典例⼦程序1 Hello world例⼦1package Example; //定义⾃⼰的包名23public class Example1 //定义⼀个类4 {5public static void main(String[] args) //系统可以执⾏的main⽅法,这⾥是⼀个公有静态⽆返回值的⽅法6 {7 System.out.println("Hello world!");8//调⽤ng包中的System类的PrintLine⽅法输出Hello world!9 }10 }2 类的基本组成⽰例1package Example;2class Person3 {4public int age; //声明公共字段age5private String name; //声明私有字段name,此时name为类的属性,下⾯通过公有⽅法进⾏访问6public String getName() {7return name;8 }9public void setName(String name) { = name;11 }1213public void eat() //定义⽆参数的eat⽅法14 {15 System.out.println("Person can eat");16 }17public void eat(String s) //定义带参数的eat⽅法,实现⽅法重载18 {19 System.out.println("Person can eat"+s);20 }21public Person() //定义⽆参构造函数,注意⽆返回值定义,⽅法与类同名22 {23 }24public Person(int age, String name) //重写⼀个带参数构造函数,注意⽆返回值定义,⽅法与类同名25 {26this.age = age; //前⼀个age为对象的字段,由this指定,后⼀个age为函数形参 = name; //前⼀个name为对象的属性,由this指定,因为在本类中可直接访问,后⼀个name为函数形参28 }2930 }31public class Example232 {33public static void main(String[] args)34 {35 Person person1 = new Person(); //调⽤类的⽆参构造函数36 person1.age = 20; //给对象的公有字段直接赋值37 person1.setName("zhangsan"); //必须使⽤公共⽅法才能给对象的属性赋值38 System.out.println("第⼀个⼈信息,姓名:"+person1.getName()+"年龄:"+person1.age);39 person1.eat(); //调⽤对象的⽆参⽅法40 Person person2 = new Person(18, "lisi");//调⽤类的有参构造函数41 System.out.println("第⼆个⼈信息,姓名:" + person2.getName() + "年龄:" + person2.age);42 person2.eat(" 馒头"); //调⽤对象的有参⽅法4344 }45 }3静态与⾮静态变量及⽅法的使⽤1package Example;23class Example34 {5public int x; //⾮静态变量6public static int y; //静态变量7void method() //⾮静态⽅法8 {9 x = 1; //正确,⾮静态⽅法可以访问⾮静态成员10 y = 1; //正确,⾮静态⽅法可以访问静态成员11 System.out.println("实例⽅法访问:x="+x+" y="+y);12 }13static void smethod() //静态⽅法14 {15//x = 3; 错误,静态⽅法不能⾮静态成员16 y = 3; //正确,静态⽅法可以访问静态成员17 System.out.println("静态⽅法访问:y="+y);19public static void main(String[] args)20 {21 Example3 prog3 = new Example3();//⽣成类的实例22 prog3.method(); //⾮静态⽅法通过实例来调⽤2324 Example3.smethod(); //静态⽅法通过类名来调⽤25 }26 }4 类继承的例⼦1package Example;23class mother4 {5public static String sex;//成员变量6public void method1()//⽗类成员⽅法17 {8 System.out.println("母亲的⽅法1!");9 }10public void method2() //⽗类成员⽅法211 {12 System.out.println("母亲的⽅法2!");13 }14 }15class boy extends mother //继承16 {17public void method2() //改写⽗类成员⽅法,Java中⽅法均为虚⽅法18 {19 System.out.println("我⾃⼰的⽅法2!");20 }21 }22public class Example423 {24public static void main(String[] args)25 {26 boy boys = new boy();27 boy.sex = "男孩";//静态变量的继承28 System.out.println("继承⽽来的字段sex的值为:"+boy.sex);29 boys.method1();//来⾃⽗类的⽅法30 boys.method2();//⾃⼰改写后的⽅法31 }5类的访问修饰符1package Example;23class program14 {5public int a; //公⽤成员6protected int b; //保护成员7int c; //友好成员8private int d; //私有成员9public void method1()10 {11 a = 1; //内部访问公⽤成员,正确12 b = 1; //内部访问保护成员,正确13 c = 1; //内部访问友好成员,正确14 d = 1; //内部访问私有成员,正确15 System.out.println("a="+a+",b="+b+",c="+c+",d="+d);16 }17 }18class program219 {20public void method2()21 {22 program1 prog1 = new program1();23 prog1.a = 2;24//prog1.b=2 //错误,只能在类的内部访问或在它的继承类⾥访问25 prog1.c=2; // 正确,在同⼀个程序集⾥都可以访问26//prog1.d = 2; //错误,只能在它的类的内部访问27 System.out.println("另⼀个类中访问公有成员a="+prog1.a+",友好成员c="+prog1.c);28 }29 }30class program3 extends program131 {32public void method3()33 {3435 b = 4; //正确,保护成员可以在它的继承类⾥访问36 System.out.println("⼦类可以访问受保护成员b="+b);37 }39public class Example540 {41public static void main(String[] args)42 {43 program1 prog1 = new program1();44 prog1.method1();45 program2 prog2 = new program2();46 prog2.method2();47 program3 prog3 = new program3();48 prog3.method3();49 }50 }6抽象类及其实现⽰例1package Example;23//应该注意的是:继承抽象类的类,要求抽象类中的抽象⽅法要被实例化4abstract class personClass //抽象类5 {6public String sex;//变量。
面向对象分析实践大作业(40%)
下面是自动售货机系统的需求陈述,请你:
1.编写分析和设计报告;
2.报告分需求分析、系统设计和对象设计三部分编撰,各部分应按相应的格式编写,并包含用例图、顺序图、类图、业务流程图、系统结构图等;
3.大作业的结构为:
A项目需求说明
B需求分析报告
C系统设计报告
D对象设计报告
E分析设计过程说明:这部分介绍分析和设计过程中使用了什么技术
需求陈述:
自动售货机系统是一种无人售货系统。
售货时,顾客把硬币投入机器的投币口中,机器检查硬币的大小、重量、厚度及边缘类型。
有效的硬币是一元币、五角币、五分币、二分币、一分币。
其他货币被认为是假币。
机器拒绝接受假币,并将其从退币孔退出。
当机器接受了有效的硬币之后,就把硬币送入硬币储藏器中。
顾客支付的货币根据硬币的面值进行累加。
自动售货机装有货物分配器。
每个货物分配器中包含零个或多个价格相同的货物。
顾客通过选择货物分配器来选择货物。
如果货物分配器中有货物,而且顾客支付的货币值不小于该货物的价格,货物将被分配到货物传送孔送给顾客,并将适当的零钱返还到退币孔。
如果分配器是空的,则和顾客支付的货币值相等的硬币将被送回到退币孔。
如果顾客支付的货币值少于所选择的分配器中货物的价格,机器将等待顾客投进更多的货币。
如果顾客决定不买所选择的货物,他投放进的货币将从退币孔中退出。
参考资料:《软件工程》张海藩清华大学出版社2009年第一版。