利用UML类图设计Java应用程序详解
- 格式:doc
- 大小:291.50 KB
- 文档页数:32
UML各种图例面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language ™),这篇课程的目的是展示出UML的精彩之处.UML中有九种建模的图标,即:∙用例图∙类图∙对象图∙顺序图∙协作图∙状态图∙活动图∙组件图∙配置图本课程中的某些部分包含了这些图的细节信息的页面链接.而且每个部分都有一个小问题,测试一下你对这个部分的理解.为什么UML很重要?为了回答这个问题,我们看看建筑行业.设计师设计出房子.施工人员使用这个设计来建造房子.建筑越复杂,设计师和施工人员之间的交流就越重要.蓝图就成标准文档为了这个行业中的设计师和施工人员的必修课.写软件就好像建造建筑物一样.系统越复杂,参与编写与配置软件的人员之间的交流也就越重要.在过去十年里UML就成为分析师,设计师和程序员之间的“建筑蓝图”.现在它已经成为了软件行业的一部分了.UML提供了分析师,设计师和程序员之间在软件设计时的通用语言.UML被应用到面向对象的问题的解决上.想要学习UML必须熟悉面向对象解决问题的根本原则――都是从模型的建造开始的.一个模型model就是根本问题的抽象.域domain就是问题所处的真实世界.模型是由对象objects组成的,它们之间通过相互发送消息messages来相互作用的.记住把一个对象想象成“活着的”.对象有他们知道的事(属性attributes)和他们可以做的事(行为或操作behaviors or operations).对象的属性的值决定了它的状态state.类Classes是对象的“蓝图”.一个类在一个单独的实体中封装了属性(数据)和行为(方法或函数).对象是类的实例instances.用例图用例图Use case diagrams描述了作为一个外部的观察者的视角对系统的印象.强调这个系统是什么而不是这个系统怎么工作.用例图与情节紧紧相关的.情节scenario是指当某个人与系统进行互动时发生的情况.下面是一个医院门诊部的情节.“一个病人打电话给门诊部预约一年一次的身体检查.接待员找出在预约记录本上找出最近的没有预约过的时间,并记上那个时间的预约记录.”用例Use case是为了完成一个工作或者达到一个目的的一系列情节的总和.角色actor是发动与这个工作有关的事件的人或者事情.角色简单的扮演着人或者对象的作用.下面的图是一个门诊部Make Appointment用例.角色是病人.角色与用例的联系是通讯联系communication association(或简称通讯communication)标准文档角色是人状的图标,用例是一个椭圆,通讯是连接角色和用例的线.一个用例图是角色,用例,和它们之间的联系的集合.我们已经把Make Appointment作为一个含有四个角色和四个用例的图的一部分.注意一个单独的用例可以有多个角色.用例图在三个领域很有作用.决定特征(需求).当系统已经分析好并且设计成型时,新的用例产生新的需求标准文档∙客户通讯.使用用例图很容易表示开发者与客户之间的联系.∙产生测试用例.一个用例的情节可能产生这些情节的一批测试用例.类图类图Class diagram通过显示出系统的类以及这些类之间的关系来表示系统.类图是静态的-它们显示出什么可以产生影响但不会告诉你什么时候产生影响.下面是一个顾客从零售商处预定商品的模型的类图.中心的类是Order.连接它的是购买货物的Customer和Payment.Payment有三种形式:Cash,Check,或者Credit.订单包括OrderDetails(line item),每个这种类都连着Item.标准文档UML类的符号是一个被划分成三块的方框:类名,属性,和操作.抽象类的名字,像Payment是斜体的.类之间的关系是连接线.类图有三种关系.关联association-表示两种类的实例间的关系.如果一个类的实例必须要用另一个类的实例才能完成工作时就要用关联.在图中,关联用两个类之间的连线表示.标准文档标准文档为了简单地表示出复杂的类图,可以把类组合成包packages.一个包是UML上有逻辑关系的元件的集合.下面这个图是是一个把类组合成包的一个商业模型.dependencies关系.如果另一个的包B改变可能会导致一个包A改变,则包A依赖包B.包是用一个在上方带有小标签的矩形表示的.包名写在标签上或者在矩形里面.点化线箭头表示依赖对象图Object diagrams用来表示类的实例.他们在解释复杂关系的细小问题时(特别是递归关系时)很有用.这个类图示一个大学的Department可以包括其他很多的Departments.标准文档这个对象图示上面类图的实例.用了很多具体的例子.UML中实例名带有下划线.只要意思清楚,类或实例名可以在对象图中被省略.标准文档每个类图的矩形对应了一个单独的实例.实例名称中所强调的UML图表.类或实例的名称可能是省略对象图表只要图的意义仍然是明确的.顺序图类图和对象图是静态模型的视图.交互图是动态的.他们描述了对象间的交互作用.顺序图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线.消息用从一个对象的生命线到另一个对象生命线的箭头表示.箭头以时间顺序在图中从上到下排列.标准文档协作图协作图也是互动的图表.他们像序列图一样也传递相同的信息,但他们不关心什么时候消息被传递,只关心对象的角色.在序列图中,对象的角色放在上面而消息则是连接线.标准文档对象角色矩形上标有类或对象名(或者都有).类名前面有个冒号(:).协作图的每个消息都有一个序列号.顶层消息的数字是1.同一个等级的消息(也就是同一个调用中的消息)有同样的数字前缀,再根据他们出现的顺序增加一个后缀1,2等等.状态图对象拥有行为和状态.对象的状态是由对象当前的行动和条件决定的.状态图statechart diagram显示出了对象可能的状态以及由状态改变而导致的转移.标准文档我们的模型例图建立了一个银行的在线登录系统.登录过程包括输入合法的密码和个人账号,再提交给系统验证信息.登录系统可以被划分为四种不重叠的状态:Getting SSN, Getting PIN, Validating, 以及 Rejecting.每个状态都有一套完整的转移transitions来决定状态的顺序.标准文档状态是用圆角矩形来表示的.转移则是使用带箭头的连线表示.触发转移的事件或者条件写在箭头的旁边.我们的图上有两个自转移.一个是在Getting SSN,另一个则在上Getting PIN.初始状态(黑色圆圈)是开始动作的虚拟开始.结束状态也是动作的虚拟结束.事件或条件触发动作时用(/动作)表示.当进入Validating状态时,对象并不等外部事件触发转移.取而代之,它产生一个动作.动作的结果决定了下一步的状态.活动图活动图activity diagram是一个很特别的流程图.活动图和状态图之间是有关系的.状态图把焦点集中在过程中的对象身上,而活动图则集中在一个单独过程动作流程.活动图告诉了我们活动之间的依赖关系.对我们的例子来说,我们使用如下的过程.“通过ATM来取钱.”这个活动有三个类Customer, ATM和 Bank.整个过程从黑色圆圈开始到黑白的同心圆结束.活动用圆角矩形表示.标准文档标准文档标准文档。
JAVA:UML类图符号表⽰⽅法学习
1.类(Class):使⽤三层矩形框表⽰。
第⼀层显⽰类的名称,如果是抽象类,则就⽤斜体显⽰。
第⼆层是字段和属性。
第三层是类的⽅法。
注意前⾯的符号,‘+’表⽰public,‘-’表⽰private,‘#’表⽰protected。
2.UML类图符号之接⼝:使⽤两层矩形框表⽰,与类图的区别主要是顶端有<<interface>>显⽰。
第⼀⾏是接⼝名称。
第⼆⾏是接⼝⽅法。
3.UML类图符号之继承类(extends):⽤空⼼三⾓形+实线来表⽰。
4.UML类图符号之实现接⼝(implements):⽤空⼼三⾓形+虚线来表⽰
5.UML类图符号之关联(Association):⽤实线箭头来表⽰,例如:燕⼦与⽓候
6.UML类图符号之聚合(Aggregation):⽤空⼼的菱形+实线箭头来表⽰
聚合:表⽰⼀种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的⼀部分,例如:公司和员⼯
组合(Composition):⽤实⼼的菱形+实线箭头来表⽰
组合:部分和整体的关系,并且⽣命周期是相同的。
例如:⼈与⼿
7.UML类图符号之依赖(Dependency):⽤虚线箭头来表⽰,例如:动物与氧⽓
8.UML类图符号之基数:连线两端的数字表明这⼀端的类可以有⼏个实例,⽐如:⼀个鸟应该有两只翅膀。
如果⼀个类可能有⽆数个实例,则就⽤‘n’来表⽰。
关联、聚合、组合是有基数的。
UML⽤例图实例解析⽤例图主要⽤来描述“⽤户、需求、系统功能单元”之间的关系。
它展⽰了⼀个外部⽤户能够观察到的系统功能模型图。
【⽤途】:帮助开发团队以⼀种可视化的⽅式理解系统的功能需求。
⽤例图所包含的元素如下: 1. 参与者(Actor) 表⽰与您的应⽤程序或系统进⾏交互的⽤户、组织或外部系统。
⽤⼀个⼩⼈表⽰。
2. ⽤例(Use Case) ⽤例就是外部可见的系统功能,对系统提供的服务进⾏描述。
⽤椭圆表⽰。
3. ⼦系统(Subsystem) ⽤来展⽰系统的⼀部分功能,这部分功能联系紧密。
4. 关系 ⽤例图中涉及的关系有:关联、泛化、包含、扩展。
如下表所⽰: a. 关联(Association) 表⽰参与者与⽤例之间的通信,任何⼀⽅都可发送或接受消息。
【箭头指向】:指向消息接收⽅ b. 泛化(Inheritance) 就是通常理解的继承关系,⼦⽤例和⽗⽤例相似,但表现出更特别的⾏为;⼦⽤例将继承⽗⽤例的所有结构、⾏为和关系。
⼦⽤例可以使⽤⽗⽤例的⼀段⾏为,也可以重载它。
⽗⽤例通常是抽象的。
【箭头指向】:指向⽗⽤例 c. 包含(Include) 包含关系⽤来把⼀个较复杂⽤例所表⽰的功能分解成较⼩的步骤。
【箭头指向】:指向分解出来的功能⽤例 d. 扩展(Extend) 扩展关系是指⽤例功能的延伸,相当于为基础⽤例提供⼀个附加功能。
【箭头指向】:指向基础⽤例 e. 依赖(Dependency) 以上4种关系,是UML定义的标准关系。
但VS2010的⽤例模型图中,添加了依赖关系,⽤带箭头的虚线表⽰,表⽰源⽤例依赖于⽬标⽤例。
【箭头指向】:指向被依赖项 5. 项⽬(Artifact) ⽤例图虽然是⽤来帮助⼈们形象地理解功能需求,但却没多少⼈能够通看懂它。
很多时候跟⽤户交流甚⾄⽤Excel都⽐⽤例图强,VS2010中引⼊了“项⽬”这样⼀个元素,以便让开发⼈员能够在⽤例图中链接⼀个普通⽂档。
UML类图解析1. 类类(Class)封装了数据和⾏为,是⾯向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。
在系统中,每个类都具有⼀定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务。
⼀个类可以有多种职责,设计得好的类⼀般只有⼀种职责。
在定义类的时候,将类的职责分解成为类的属性和操作(即⽅法)。
类的属性即类的数据职责,类的操作即类的⾏为职责。
设计类是⾯向对象设计中最重要的组成部分,也是最复杂和最耗时的部分。
类图(Class Diagram)使⽤出现在系统中的不同类来描述系统的静态结构,它⽤来描述不同的类以及它们之间的关系。
在系统分析与设计阶段,类通常可以分为三种,分别是实体类(Entity Class)、控制类(Control Class)和边界类(Boundary Class),下⾯对这三种类加以简要说明:(1) 实体类:实体类对应系统需求中的每个实体,它们通常需要保存在永久存储体中,⼀般使⽤数据库表或⽂件来记录,实体类既包括存储和传递数据的类,还包括操作数据的类。
实体类来源于需求说明中的名词,如学⽣、商品等。
(2) 控制类:控制类⽤于体现应⽤程序的执⾏逻辑,提供相应的业务操作,将控制类抽象出来可以降低界⾯和数据库之间的耦合度。
控制类⼀般是由动宾结构的短语(动词+名词)转化来的名词,如增加商品对应有⼀个商品增加类,注册对应有⼀个⽤户注册类等。
(3) 边界类:边界类⽤于对外部⽤户与系统之间的交互对象进⾏抽象,主要包括界⾯类,如对话框、窗⼝、菜单等。
在⾯向对象分析和设计的初级阶段,通常⾸先识别出实体类,绘制初始类图,此时的类图也可称为领域模型,包括实体类及其它们之间的相互关系。
2. 类的UML图⽰在UML中,类使⽤包含类名、属性和操作且带有分隔线的长⽅形来表⽰,如定义⼀个Employee类,它包含属性name、age和email,以及操作modifyInfo(),在UML类图中该类如图所⽰:1class Employee {2private String name;3private int age;4private String email;56public void modifyInfo() {7 ......在类图2中,操作method1的可见性为public(+),带⼊了⼀个Object类型的参数par,返回值为空(void);操作method2的可见性为protected(#),⽆参数,返回值为String类型;操作method3的可见性为private(-),包含两个参数,其中⼀个参数为int类型,另⼀个为int[]类型,返回值为int类型。
UML中数据流图,⽤例图,类图,对象图,⾓⾊图,活动图,序列图详细讲述保存供参考这个⽂章,是我在急需的情况下在园⼦⾥搜索到的,原创作者是:DO-websoftware,为了⾃⼰看⽅便,所以复制到我的空间,希望原创者不要介意哦~~~~很详细的介绍,对我的帮助很⼤,谢谢哦。
类图,对象图,⾓⾊图:⼀、UML中基本的图范畴:在 UML 2 中有⼆种基本的图范畴:结构图和⾏为图。
每个 UML 图都属于这⼆个图范畴。
结构图的⽬的是显⽰建模系统的静态结构。
它们包括类,组件和(或)对象图。
另⼀⽅⾯,⾏为图显⽰系统中的对象的动态⾏为,包括如对象的⽅法,协作和活动之类的内容。
⾏为图的实例是活动图,⽤例图和序列图。
⼆、UML中的类图:1.类图的表⽰:类的 UML 表⽰是⼀个长⽅形,垂直地分为三个区,如图 1 所⽰。
顶部区域显⽰类的名字。
中间的区域列出类的属性。
底部的区域列出类的操作。
在⼀个类图上画⼀个类元素时,你必须要有顶端的区域,下⾯的⼆个区域是可选择的(当图描述仅仅⽤于显⽰分类器间关系的⾼层细节时,下⾯的两个区域是不必要的)。
描述:顶部区域显⽰类的名字。
中间的区域列出类的属性。
底部的区域列出类的操作。
当在⼀个类图上画⼀个类元素时,你必须要有顶端的区域,下⾯的⼆个区域是可选择的(当图描述仅仅⽤于显⽰分类器间关系的⾼层细节时,下⾯的两个区域是不必要的)。
·类名:如果是抽象类,则采⽤斜体·类属性列表:name : attribute type 如 flightNumber : Integer,这是最常见的表达形式name : attribute type = default value 如 balance : Dollars = 0,这是带有默认值的表达形式·类⽅法列表:name(parameter list) : type of value returned注意:在业务类图中,属性类型通常与单位相符,这对于图的可能读者是有意义的(例如,分钟,美元,等等)。
UML对象图的绘制方法与实际应用UML(Unified Modeling Language)是一种用于软件系统建模的标准化语言,其中的对象图是一种重要的建模工具。
对象图能够清晰地展示系统中的各个对象及其之间的关系,是开发人员在软件设计和开发过程中不可或缺的一环。
本文将介绍UML对象图的绘制方法及其在实际应用中的价值。
一、UML对象图的绘制方法1. 确定对象在绘制UML对象图之前,首先需要明确系统中的对象。
对象是系统中的一个实体,可以是具体的人、物或抽象的概念。
确定对象的过程需要对系统进行分析和抽象,以便准确地反映系统的结构和行为。
2. 绘制类在UML对象图中,每个对象都有对应的类。
类是对象的模板,描述了对象的属性和方法。
绘制类时,需要标明类名,并在类中列出属性和方法。
3. 绘制对象在类的基础上,根据系统的实际情况,绘制出各个对象。
每个对象都有一个唯一的标识符,通常用下划线加上对象名表示。
对象可以通过箭头和线条来表示与其他对象之间的关系,例如关联、聚合、组合等。
4. 绘制关系UML对象图中的关系可以分为三种:关联、聚合和组合。
关联表示对象之间的一般关系,聚合表示对象之间的整体与部分关系,组合表示对象之间的强关系。
根据实际情况,选择合适的关系来表示对象之间的联系。
二、UML对象图的实际应用1. 系统设计UML对象图在系统设计中起到了重要的作用。
通过绘制对象图,开发人员可以清晰地了解系统中的各个对象及其之间的关系,从而更好地进行系统设计。
对象图能够帮助开发人员分析系统的结构和行为,提高系统的可维护性和可扩展性。
2. 代码生成在软件开发过程中,UML对象图可以直接用于代码的生成。
通过工具的支持,开发人员可以将对象图转换为具体的代码实现,大大提高了开发效率。
对象图能够提供详细的类和对象信息,使得代码生成更加准确和高效。
3. 交流与沟通UML对象图是一种通用的建模语言,可以帮助开发人员之间进行有效的交流和沟通。
UML组件图的使用与案例分析UML(Unified Modeling Language)是一种用于软件开发的标准建模语言,可以帮助开发人员更好地理解和设计软件系统。
其中,UML组件图是一种用于表示系统中的组件及其之间的关系的图形表示方法。
本文将介绍UML组件图的使用方法,并通过一个案例分析来说明其实际应用。
一、UML组件图的基本概念在开始介绍UML组件图之前,我们先来了解一些基本概念。
在UML中,组件是指系统中的一个模块或部分,它可以是一个软件包、一个类、一个库或一个独立的可执行文件。
组件之间的关系可以是依赖、关联、聚合或组合等。
二、UML组件图的符号和结构UML组件图使用一些特定的符号来表示组件和它们之间的关系。
常用的符号包括:组件(用矩形表示)、接口(用圆形表示)、依赖关系(用虚线箭头表示)等。
组件图的结构一般分为两个层次:顶层组件和底层组件。
顶层组件是系统中的主要组件,它们直接与外部系统或用户进行交互;底层组件是顶层组件的子组件,它们负责实现底层功能。
三、UML组件图的使用方法使用UML组件图可以帮助开发人员更好地理解和设计系统。
下面是一些使用UML组件图的方法:1. 确定系统的顶层组件:首先要确定系统中的主要组件,这些组件通常与系统的主要功能模块对应。
例如,一个电子商务系统的主要组件可能包括用户界面、订单处理、支付系统等。
2. 定义组件之间的关系:根据系统的需求和功能,确定组件之间的关系。
例如,用户界面组件可能依赖于订单处理组件和支付系统组件,订单处理组件可能关联于数据库组件等。
3. 设计组件接口:为每个组件定义接口,接口定义了组件对外部系统的可见行为。
接口应该清晰明确,以便其他组件可以正确地使用它。
4. 确定组件的实现方式:根据系统的需求和技术要求,确定每个组件的实现方式。
组件的实现方式可以是一个类、一个库或一个独立的可执行文件。
四、案例分析:电子商务系统的UML组件图为了更好地理解UML组件图的使用,我们以一个电子商务系统为例进行分析。
UML中的类图详解及其应用场景在软件开发过程中,UML(统一建模语言)被广泛应用于需求分析、系统设计和软件开发等各个阶段。
其中,类图作为UML的核心图表之一,用于描述系统中的类、对象以及它们之间的关系。
本文将详细介绍UML中的类图,并探讨其在实际应用中的场景。
一、类图的基本概念类图是一种静态结构图,用于表示系统中的类、接口、关联、继承、依赖等元素及其之间的关系。
在类图中,类用矩形表示,类名位于矩形顶部,类的属性位于矩形中部,类的操作(方法)位于矩形底部。
类之间的关系通过连线表示,如关联关系用实线箭头表示,继承关系用空心三角箭头表示,依赖关系用虚线箭头表示等。
二、类图的元素及其关系1. 类(Class):类是对象的抽象表示,用于描述具有相同属性和行为的一组对象。
类图中的类用矩形表示,类名位于矩形顶部。
2. 接口(Interface):接口是一组方法的集合,用于描述类的行为。
接口在类图中用带有<<interface>>标记的矩形表示。
3. 属性(Attribute):属性是类的特征,描述了类的状态。
属性在类图中用名称:类型的形式表示,例如“name:String”。
4. 操作(Operation):操作是类的行为,描述了类的方法。
操作在类图中用名称(参数列表):返回类型的形式表示,例如“getName():String”。
5. 关联关系(Association):关联关系描述了类之间的连接,表示一个类与另一个类之间的关联。
关联关系在类图中用实线箭头表示。
6. 继承关系(Inheritance):继承关系描述了类之间的继承关系,表示一个类继承自另一个类。
继承关系在类图中用空心三角箭头表示。
7. 依赖关系(Dependency):依赖关系描述了类之间的依赖关系,表示一个类依赖于另一个类。
依赖关系在类图中用虚线箭头表示。
三、类图的应用场景1. 系统设计:类图是系统设计的重要工具之一。
利用UML类图设计Java应用程序详解(一)UML已成为面向对象设计的标准图形化工具,在UML定义的各种图中,本文只涉及类图。
Java应用程序由许多类所构成,类图的设计与实现,是Java实现面向对象应用程序的核心。
本文通过一个具体的应用程序的设计与实现过程,详细说明了利用UML类图设计Java应用程序,使得开发过程标准化、可视化,代码编程简单化。
在类图中,类被描述为带有三层的盒子。
顶层为类名,一般用加粗字体表示。
如果类是抽象的,其名称用斜体表示;如果类是接口,则在类名上方标注<<interface>>。
中间层包含类的属性(或变量),底层包含类的方法。
与类名相似,如果方法是抽象的,那么它的名称也用斜体表示。
我们要设计的应用程序CDrawApp应用程序在基于字符的网格上画点、框和文本串,该应用程序涉及到Java面向对象的许多概念与应用方法,非常系统、全面,在您仔细研读后,定能迅速掌握UML类图,并将其应用到实际的Java应用程序开发过程中。
为减少代码长度,让程序简单易懂,这里使用Java控制台窗口显示程序运行结果。
该程序总共由1 0个大类组成,以下分别介绍。
一、Point类在CDrawApp程序中定义的第一个类是Point类,该类用于通过x和y坐标在网格上标识一点。
其类图设计为:在该类中,有2个成员变量x和y,类图中,“-”表示变量或方法为private,“+”表示publ ic,“#”则表示protected。
该类定义了三个不同的构造函数,这是重载(overload)的例子。
接着该类设计了7个访问方法。
getX()和getY()方法分别返回一点的x和y坐标。
SetX()和setY()方法根据参数xValue和yValue的值设置这些坐标的值。
两个add()方法通过被访问点的坐标加上一个值来建立一个新的Point对象。
New运算符建立类的新实例。
它后面紧跟着初始化新生成实例的构造函数。
toString()方法返回类String的一个对象,该对象用一个有序对来描述一个点。
依据设计的类图,其Java实现代码为:二、CGrid类CGrid类用于定义指定大小的字符网格。
它提供基本方法集,通过加入到这些方法中的其它类来得到扩展。
该类的类图为:CGrid类声明3个变量:width、depth和grid[][]。
width和depth 变量用于指定grid[][]的水平和垂直尺寸,grid[][]是保存网格字符的字符数组的数组。
CGrid中的变量声明为protected,这就规定了它们只能在声明它们的包中和CGrid的任何子类中访问。
CGrid类只有一个单一构造函数,它设置width和depth的值,分配grid[][]数组,然后调用blankGrid()以空格为grid[][]赋值。
CGrid有4种访问方法。
blankGrid()方法只是简单地用空格字符来调用fillGrid()。
fillGrid()方法把grid[][]的每个元素都设置为ch参数。
GetCharFrom()方法用于找出网格中给定位置的字符。
SetCharAt()用于把网格中一点设置成特定字符。
在GetCharFrom()和SetCharAt()方法中使用Point类来定义它们的参数,这是类与类之间关联的例子,我们稍候讨论。
根据以上类图,CGrid类的原代码为:三、CGObject类CGObject类是抽象类的例子,它通过abstract方法来限制其子类的行为。
Abstract方法必须由非abstract子类实现。
其类图设计如下:CGObject类用于定义在网格上显示的对象的一般行为。
它有两个变量:location和dr awCharacter。
Location变量的类型是Point,用于在网格上指定一个对象所在的点。
Draw Character变量用于画对象的字符。
CGObject有三个方法,而没有构造函数。
因为abstract类没有完整定义,所以它没有构造函数,也没有对象实例。
第一个方法addToGrid()不是abstract类型的。
它以类PrintCGrid的对象作为参数,调用PrintCGrid类的addCGObject()方法,把this对象加到网格中。
this关键字指当前对象。
用addToGrid()方法调用CGObject类的子类的对象,这些对象加到类PrintCGrid的对象中。
CGObject的其它两个方法都用abstract关键字声明。
这意味着,这两个方法在能够由CGObject类的非abstract子类使用前必须被覆盖。
覆盖方法必须拥有与anstract方法相同的名字、参数和返回值。
Display()方法用于再网格上显示类PrintCGrid的一个对象。
Descr ibe()方法用于显示网格对象的描述。
CGObject类的代码为:四、PrintCGrid类PrintCGrid类是CGrid类的子类,它定义了允许把对象加到网格中的附加变量和方法。
它也提供了显示网格的方法。
PrintCGrid类的类图如下图所示:PrintCGrid类与CGrid类的关系是子类与父类的关系。
在类图中用实线与空心箭头从子类指向父类表示。
>PrintCGrid类的原代码为:在以上代码中,PrintCGrid声明3个变量:displayList[]、maxObjects和numObjects。
这些变量都声明为proceted,从而把对它们的访问限制在一个包中和PrintCGrid的子类中。
DisplayList[]变量是类CGObject(见以下类的介绍)的数组。
但这并不意味着该数组包含作为类CGObject实例的对象。
这是不可能的,因为CGObject是抽象的。
把DisplayList[]声明成类CGObject的数组的目的,是允许该数组包含CGObject类的子类的对象。
一般来说,如果一个变量声明成类X,那么可以把该变量赋值为X的子类的对象。
MaxObjects变量声明成static并且final。
使用static修饰符声明的变量,它们被作为一个类实例的所有对象公用,不会被每个实例复制,静态变量又成为类变量。
没有被声明成静态的变量是实例变量,对作为一个类的实例的每个对象进行复制。
Final修饰符用于把变量标识成常量。
用final修饰符声明的变量必须在声明时进行初始化,不能再声明之外的任何地方赋值。
MaxObjects常量初始化为100,表示可以加到displ ayList[]中的对象的最大数目。
NumObjects变量用于统计加到网格的displayList[]中的对象实际数目。
PrintCGrid有一个构造函数。
该构造函数有两个参数:x和y,它们表示网格的水平和垂直方向的尺寸。
构造函数调用super()方法,并把这两个变量当着变元传递过去。
Super()方法是构造函数调用语句的一个例子。
它以x和y作为变元调用PrintCGrid的父类(即C Grid类)的构造函数。
CGrid的构造函数初始化其width和depth变量,分配grid[][]数组,并用空格给该数组元素赋值。
CGrid的构造函数运行完后,PrintCGrid的构造函数继续把n umObjects设置为0,并分配displayList[]数组。
PrintCGrid提供10个访问方法。
AddCGObject()方法把对象加到displayList[]数组中。
DeleteCGObject()方法删除位于指定索引位置的对象。
所有的后续对象都向前移动,以填充被删除对象留下的空缺。
DeleteLastObject()方法通过简单地把numObjects减1来删除最后一个对象。
GetNumObjects方法返回displayList[]中的对象数目。
GetObject方法返回displayList[]中指定位置的对象。
clearGrid()方法通过把numObjects设置为0去清除所有对象。
DrawGrid()方法使用从CGrid类继承的方法清空网格,然后调用displayList[]中每个对象的display()方法。
displayGrid[]方法在控制台窗口中显示每一行网格。
它是继承的例子。
Grid[][]数祖在C Grid类中定义,由PrintCGrid所继承。
它由CGObject类的所有子类的drawGrid()方法和d isplay()方法更新。
PrintGrid()类用它来在控制台窗口中打印字符。
ValueOf()方法用于displayGrid()方法中,它是String 类的静态方法。
它把字符数组转换成String对象。
静态方法类似于静态变量,它整体上应用于类,而不是作为类实例的各个对象使用。
由于面向对象,静态方法只能访问静态变量。
所有静态方法都是定局的,不能被覆盖。
DisplayRow()方法在控制台窗口上显示一行网格,show()方法把drawGrid()和display Grid()方法组合成一个方法。
五、BorderPrintCGrid类BorderPrintCGrid类是PrintCGrid类的子类,它进一步扩展了CGrid类。
它增加了生成类PrintCGrid对象的边界的变量和方法。
类图见如下所示:BorderPrintCGrid类有四个私有变量:useBorder、borderCharacter、horizEdge和ver tEdge。
UseBorder是boolean类型的变量,它决定边界是否应该显示。
BorderCharacter 为用于显示边界的字符。
HorizEdge和vertEdge用于显示边界的水平和垂直边界的String 对象。
BorderPrintCGrid类有两个。
第一个构造函数没有参数。
它调用PrintCGrid类的构造函数构造一个75字符宽20行高的网格,其边界字符为*。
SetBorderDefaults()方法用于初始化BorderedPrintCGrid类的变量。
第二个构造函数类似于第一个构造函数,但它提供了直接指定网格尺寸及边界字符的功能。
BorderPrintCGrid类提供4个访问方法。
SetBorderDefaults()方法使用enableBorder()方法和setBorderCharacter()方法初始化BorderedPrintCGrid类的变量。
enableBorder()方法把useBorder设置成true或false。
setBorderCharacter()方法设置displayGrid()方法所用的b orderCharacter、horizEdge和vertEdge变量。
BorderedPrintCGrid类是PrintCGrid的子类,其类图关系表示为:displayGrid()方法覆盖PrintCGrid类的displayGrid()方法。