面向对象分析与设计_类图

简介: 面向对象分析与设计_类图

判断题


类与对象之间的关系,可以理解为模板与具体实例之间的关系  T


类是现实世界中客观存在的事物或实体。 F


类是具有相同属性和服务的一组对象的集合 T


对象的属性都有值,类的属性没有值 T


类的可见性描述了其属性和操作是否对于其他类可见,从而确定是否可以被其他类引用 T


类的可见性描述了其属性和操作是否对于其他对象可见,从而确定是否可以被其他对象引


T


类的作用域限定了能够共享类的属性和操作的对象的数目 T


CRC(类-责任-协作者)方法是经典的寻找类的方法。在UML时代也有其生存的空间 T


类之间的关联关系和依赖关系在很多场合下不用区分 F


多重性只存在于类的关联关系中,在聚合关系中不存在 F


从一个类所创建的所有对象可以使用同一组属性和方法。T


在类图中可以创建包。T


类的每个方法应该有一个参数。 F


选择题


类通常可以分为实体类、( )和边界类. C.控制类


对象特征的要素是( )。D.属性


下列关于接口的关系说法不正确的是 D.在程序运行的时候,其他对象不仅需要依赖于此接口,还需要知道该类对接口实现的其他信息


下列关于类方法的声明,不正确的是( )。 C.每个方法应该有一个参数


UML的系统分析进一步要确立的三个系统模型是( )、对象动态模型和系统功能模型 对象静态模型


UML的客户需求分析、系统分析和系统设计阶段产生的模型,其描述图符( ) A.完全相同

类和对象都有属性,它们的差别是:类描述了属性的类型,而对象的属性必须有( ) A.

具体值


关于下面的类图,说法错误的是( )D.属性ID的类型是Integer类型,初始值为1且是私有的


分析下面的类图,其中“个人客户”与“客户”之间是( ) B.泛化关系


当一个类的部分对象与另一个类的部分对象存在属性值或结构上的联系时,这两个类之间


应当存在( ) A.关联关系


4-20、分析下面的类图,其中“客户”与“订单”之间的关系“下订单”是指( )



A.关系名称

当一个类的方法的参数的数据类型是另一个类的定义,或者一个类的方法使用了另一个类


的属性或方法,则这两个类之间存在( )。 B.依赖关系


两个类之间存在着部分和整体的关系,则两个类之间的关系是( ) C.聚合关系


接口和它的实现类之间存在( )  C.实现关系  


UML中关联的多重度是指 B.一个类的实例能够与另一个类的多个实例相关联


( )不是对象具有的特性  C.顺序


类通常可以分为实体类、( )和边界类。  C.控制类


类和对象都有属性,它们的差别是:类描述了属性的类型,而对象的属性必须有( )。C.具体值


多选题


类图应该画在Rational Rose的( )视图中  


A.Use Case View

B.Login View

UML中,类的主要版型有( )


A.控制类

C.实体类


UML的类图包含哪些抽象的层次( )


A.概念层

B.说明层

C.实现层

填空题


4 - 1在UML的图形表示中,______ 的表示法是一个矩形,这个矩形由3个部分构成


4 - 2共享聚合的“部分”对象可以是任意“整体”对象的一部分,表示事物的整体/部分关系较弱的情况,“整体”端的重数应该是 *


4 – 3组合聚合是指“整体”拥有它的“部分”,它具有强的物主身份,表示事物的整体/部分关系较强的情况。“部分”生存在“整体”中,不可分离,它们与“整体”一起存在或消亡。“整体”端的重数必须是 1


当一个类的对象可以充当   多种角色时,___ 关联就可能发生 自身


系统分析是在客户需求分析规格说明的基础之上对其进行的 深入细化


对象图中的 ____ 是类的特定实例, ____ 是类之间关系的实例,表示对象之间的特定关系 对象 | 链


类之间的关系包括: ____ 、____ 、____ 和 ____ 。


依赖|泛化|关联|实现


类中方法的可见性包含3种,分别是: ____ 、____ 和 ____ 。


共有;公有;public|私有;private|受保护;protected


在UML软件开发过程系统分析阶段产生的对象模型有三种模型,它们分别是:____ 模


型、 ____ 模型、 ____ 模型。


对象的静态|对象的动态|系统功能

接口是可以在整个模型中反复使用的一组行为,是一个没有 ____ ,而只有 ____ 的类


属性|方法


在泛化关系中, ____ 可以替代 ____ ,也就是说,后者出现的地方,前者都可以出现。但


是反过来却不成立。


子类|父类


最通常的依赖关系是一个类操作的 ____ 中用到了 ____ 的定义。


形构|另一个类


类之间的关系包括 ____ 关系、 ____ 关系、 ____ 关系和 ___ 关系。


依赖|泛化|关联|实现


类的定义要包含  ____ 、 ____ 和 ____ 三要素。


类的属性|类所要执行的操作|属性的类型


对象图中的对象是 ____ 的特定实例。


对象,链


类中方法的可见性包含3种,分别是 ____ 、____ 和 ____ 。


共有;公有;public|私有;private|受保护;protected


主观题


4-42、某超市购买商品系统的需求描述如下:

①顾客带着所要购买的商品到达营业厅的销售点终端进行付款结账;

②销售点终端设在门口附近;

③出纳员与销售点终端交互;

④销售点终端负责接收数据、显示数据和打印购物单;

⑤出纳员录入该商品信息;

⑥系统根据商品的单价,确定顾客所购买的全部商品的总金额;

⑦系统显示当前商品的描述信息。

根据上述需求,完成以下任务:①根据需求陈述,确定存在的类,以及类之间的关系;②

根据问题域知识,确定存在的类,以及类之间的关系;③对初步找到的类,以及类之间的

关系进行筛选和调整;④细化关联关系的细节,并创建类图


答案:


(1)需求陈述中隐含的类,以及类之间的关联


①可以通过客观存在的实体,来确定隐含的类。顾客,商品,营业厅,销售点终端,出纳员,系统。②可以通过需要保存的信息,来确定隐含的类。购物单,商品信息。③顾客带着商品到销售点终端进行结账。④出纳员与销售点终端交互。⑤超市拥有多个销售点终端,但在某一个时刻,一个出纳员只会在一台销售点终端上进行操作。⑥会存在多个出纳员同时在多台销售点终端上进行操作,所以系统要处理并发的访问。⑦系统必须提供安全性与可靠性。⑧需求陈述中的第4点到第7点,都是描述一个类拥有的服务。属于类的操作范畴。


(2)根据问题域知识得出的隐含的类,以及类之间的关联


①系统是由一个局域网络组成的,包括软硬件产品的集成。②购物单的处理在后台服务器端。销售点终端作为前端,只负责信息的接收、显示、打印。③商品信息的处理在后台服务器端。


(3)经过初步分析得出的类,以及类之间的关联,这些只能作为候选的类及关联,还需要经过进一步的筛选,以去掉不必要、不正确的类及关联。


筛选标准如下。


(1)删除不必要的类,以及它们之间的关联


如果在分析确定类与对象的过程中已经删除了某个候选类,则与这个类有关的关联也应该去掉,或重新表达这个关联。


在前面已经找出了以下的候选类:顾客,商品,营业厅,销售点终端,出纳员,系统,购物单,商品信息。


“商品”是一个客观存在的物品,它在系统中的呈现是“商品信息”,所以“商品”不能作为类而存在。在本答案提供的类图中,保留“商品信息”类,放弃“商品”类。


“营业厅”只是一个办公场所,不是系统中的某个功能,所以“营业厅”不能作为类而存在。


“系统”是一个待开发的软件产品,类是其中的功能实现的基本单元,所以“系统”不能作为类而存在。


在传统的面向对象分析方法中,顾客,出纳员,作为客观存在的实体,他们需要与系统进行交互。所以,可以作为类而保留下来。对应地,在UML分析方法中,顾客和出纳员作为“参与者”出现,而参与者是一个《版型》类。


销售点终端,在其上要完成信息的接收、显示和打印。所以在其上要运行软件功能。在UML分析方法中,销售点终端至少要起“边界类”的作用。所以,可以作为类而保留下来。


至此,删除了“商品”、“系统”、“营业厅”等候选类,因此与这些类有关的关联也应该删除。


(2)与问题域无关的或应在实现阶段考虑的关联


顾客带着商品到销售点终端进行结账。通过分析发现,顾客只是把实物商品带到销售点终端,然后付钱。真正在销售点终端上录入信息、打印信息的人是出纳员。因此,顾客与销售点终端之间不存在关系。


“系统处理并发的访问”、“系统必须提供安全性与可靠性”,并没有标明对象之间的新关联,它告诉人们在实现阶段需要使用实现并发访问的算法,以处理并发事务。以及考虑安全性与可靠性的实现。所以,由它们得不出类之间的关联。


(3)瞬时事件


关联关系应描述问题域的静态结构,而不应是一个瞬时事件。


在这里,“出纳员与销售点终端交互”在一个固定时期内是稳定的关系。但是,“出纳员录入该商品信息”就是一个瞬时事件。


(4)避免冗余和遗漏


应该去掉那些可以用其他关联定义的冗余关联;发现遗漏应该及时补上。


一张购物单会有很多商品组成,这里“商品”意指“商品信息”,而某个商品可能会购买多件。所以,可以对重复多次的商品构造一个“商品项目”,它包含了商品单价、数量、折扣优惠等信息。而“商品信息”仅仅提供了商品编号、原始单价、进货商、进货时间等信息。


当然了,也可以不新增“商品项目”这个类,而是把“商品项目”类的属性合并到“购物单”类的属性中。切记!这点很重要。也因此导致了类图结构的确定会因人而异。


(5)标明多重性


最后应该初步判定各个关联的类型,并粗略地确定关联的多重性。


多重性是指“确定了一个类的一个对象后,与之关联的那个类有几个对象与之呼应”。如果只有1个对象呼应,那么就是“1对1”的关系,否则是“1对多”的关系。在类图中,“1对多”的关系,可以表示成“1..n”或者“*”。


经过上述分析,得出类图如下所示。



4-43、假设要开发一个简化的图书借阅系统,试根据需求描述,设计能反映该系统的功能及实现的类图模型,并给予简单的说明。

需求描述:读者通过图书借阅系统查询可以借阅的图书。读者在书架上找到相应的书籍

后,到柜台通过图书管理员办理借阅手续。想还书的读者在柜台上通过图书管理员办理归

还手续。还书时,必须检查借阅时间是否超期;若超期,则进行相应罚款。图书借阅系统

不进行书籍的入库操作(即新书登记、旧书下架)


答案:


(1)需求陈述中隐含的类,以及类之间的关联


①可以通过客观存在的实体,来确定隐含的类。读者,图书借阅系统,图书,柜台,图书管理员。②可以通过需要保存的信息,来确定隐含的类。借阅信息,还书信息,罚款信息。③读者通过图书借阅系统查询可以借阅的图书。④图书管理员在柜台上办理借阅手续。⑤图书管理员在柜台上办理归还手续。⑥图书管理员提供罚款信息,读者支付罚款金额。


(2)根据问题域知识得出的隐含的类,以及类之间的关联


①图书借阅系统是由一个局域网络组成的,包括软硬件产品的集成。②借阅信息和还书信息的处理在后台服务器端。柜台作为前端,只负责信息的接收、显示、打印。③罚款信息的处理在后台服务器端。④在图书编目体系中,“图书信息”类包括图书分类号,书名,作者,出版社,出版年份,ISBN,单价等信息。而在图书馆体系中,每本书可能收藏多本,所以需要对每本书添加流通编号,书名,馆藏地点,入库时间,流通状态等信息。所以,必须设置一个“图书流通编目”类,来保存这些信息。


(3)经过初步分析得出的类,以及类之间的关联,这些只能作为候选的类及关联,还需要经过进一步的筛选,以去掉不必要、不正确的类及关联。


筛选标准如下。


(1)删除不必要的类,以及它们之间的关联


在前面已经找出了以下的候选类:读者,图书借阅系统,图书,柜台,图书管理员,借阅信息,还书信息,罚款信息,图书信息,图书流通编目。


“图书”是一个客观存在的物品,它在系统中的呈现是“图书信息”,所以“图书”不能作为类而存在。在本答案提供的类图中,保留“图书信息”类,放弃“图书”类。


“图书借阅系统”是一个待开发的软件产品,类是其中的功能实现的基本单元,所以“图书借阅系统”不能作为类而存在。


在传统的面向对象分析方法中,读者,图书管理员,作为客观存在的实体,他们需要与系统进行交互。所以,可以作为类而保留下来。对应地,在UML分析方法中,读者和图书管理员作为“参与者”出现,而参与者是一个《版型》类。


柜台,实质上就是一台电脑终端,在其上要完成信息的接收、显示和打印。所以在其上要运行软件功能。在UML分析方法中,柜台至少要起“边界类”的作用。所以,可以作为类而保留下来。


至此,删除了“图书”、“图书借阅系统”等候选类,因此与这些类有关的关联也应该删除。


(2)与问题域无关的或应在实现阶段考虑的关联


本案例中,该原则不起作用。


(3)瞬时事件


本案例中,该原则不起作用。


(4)避免冗余和遗漏


“借阅信息”和“还书信息”这两个类,大多数的属性都是同样的,后者多了个“还书时间”属性,因此可以把这两个类合二为一,定义为“借阅记录”类。


(5)标明多重性


最后应该初步判定各个关联的类型,并粗略地确定关联的多重性。



多重性是指“确定了一个类的一个对象后,与之关联的那个类有几个对象与之呼应”。如果只有1个对象呼应,那么就是“1对1”的关系,否则是“1对多”的关系。在类图中,“1对多”的关系,可以表示成“1..n”或者“*”。


经过上述分析,得出类图如下所示。


4-44、把下面的关系分类为泛化、聚合或关联等关系。

(l)文件包含记录

(2)多边形由有序点集成

(3)某学生选择了某教授的课程

(4)类有多个属性


答案:


“文件包含记录”,是聚合关系,体现了整体-部分的关系。


“多边形由有序点集成”,是聚合关系,体现了整体-部分的关系。


“某学生选择了某教授的课程”,是关联关系,体现了三个类之间的某些属性上的联系。


4-45、网络用户授权使用某几个工作站。

对每台这样的机器,给用户一个账户和密码。画一个类图,并说明你所作的假设


答案:


客观存在的实体包括网络用户和工作站。所以潜在的类:网络用户,工作站。 从“对每台这样的机器,给用户一个账户和密码”中,可以得到以下信息:每台工作站是一个具体的对象,从而是“工作站”类的一个实例。工作站不同,对应着账户不同,密码可以不同,也可以相同。那么,如何区分不同的机器和不同的账号呢?毫无疑问,每台工作站要有惟一的机器编号,不同的机器编号分配不同的账号。所以,需要一个“账户信息”类,其中具有“机器编号”、“登录账号”、“登录密码”等属性。 需要永久保存的实体是“账户信息”。所以潜在的类:账户信息。 最后,通过综合,得到该系统的所有类:网络用户,工作站,账户信息。 20002563246000网络用户使用工作站,工作站依赖账户信息判断“登录是否成功”。所以,网络用户和工作站之间有联系(1对多),工作站和账户信息之间有联系(1对1)。从而得到类图如下所示。



4-46、请标识出下图中空中运输系统类图的多重性


答案:


1个飞机场坐落在1个城市,所以确定了“飞机场”类的一个对象后,对面的“城市”类只有一个对象与之呼应。所以“城市”端的多重性为“1”。 1个城市可以修建多个飞机场(比方说,上海市有虹桥机场和浦东机场),所以确定了“城市”类的一个对象后,对面的“飞机场”类可以有多个对象与之呼应。但是,有些小城市不需要建设飞机场(例如,佛山市的市民出行时可以使用广州市的飞机场),所以“飞机场”端的多重性为“0..n”。 24765036957000依此类推,可以确定其他关联关系的多重性。补齐了多重性的类图如下图所示。



4-47、为创建职工信息系统的类图,需要识别不同的类。Employee和Address类是其中的两个类。Employee类包含职工代码(empcode)、名字(name)、地址(address)和生

日(birthday)等属性。Address类包含家庭号码(houseNumber)、街道号码

(streetNumber)、城市(city)和邮编(zipcode)等属性。画出该系统的类图,并识别Employee类和Address类之间的关系


答案:


Employee类的地址(address)属性,其完整的数组值可以取自Address类的所有属性值,所以Employee类和Address类之间是关联关系。进一步地,Employee类可以看作“整体”,Address类可以看作“部分”,所以Employee类和Address类之间是聚合关系(一种特殊的关联关系)。


4-48、在顾客信息系统中,产生顾客账单的Bill类使用Purchase类的calculateAmt()操作所计算的总金额值。识别Bill类和Purchase类之间的关系


答案:


因为Bill类使用了Purchase类的calculateAmt()操作,获得总金额值。所以,属于Bill类的方法调用了Purchase类的方法,因此,Bill类依赖于Purchase类。依赖关系的箭头指向Purchase类。



4-49、一个研究生在软件学院做助教(TeachingAssistant),同时还在校园餐厅打工做收银员(Cashier)。也就是说,这个研究生有3种角色:学生、助教、收银员。但在同一时刻只能有一种角色。根据上面的陈述,试分析下面哪种设计是最合理的



答案:


(B) 这种设计可以保证同一时刻只有一种角色。由于使用了接口,因此系统具有较好的灵活性。如果将来要增加一种新的角色,那么只需增加一个新的类,并且该类实现了接口PersonRole既可。而系统的其他部分可以不用改动。事实上,方案(B)使用了多态和接口的特性。这种设计方法是OO设计中的一个重要原则。


4-52、在如下所示的原始类图中,根据Liskov替换原则(即子类可以替换父类出现在父类出现的任何地方),只要可以使用Engine类型的对象,就可以使用SportsEngine类型的对象。也就是说,在这个类图中,Vehicle类型的对象可以使用SportsEngine类型的对象。试分析方案(A)~(D)中,如何改进原始类图,使得只有SportsVehicle类型的对象才能使用SportsEngine类型的对象



答案:


(A) 应该注意这个设计要求的是“只有SportsVehicle类型的对象才能使用SportsEngine类型的对象”。 方案(A)中,Vehicle类和Engine类之间不存在关系,所以避免了Vehicle类的其他子类使用Engine类的子类(在Liskov替换原则的作用下)。此外,SportsVehicle类与SportsEngine类之间是聚合关系,而且SportsVehicle类是“整体”,SportsEngine类是“部分”,正好符合实际情况,也满足题目要求。


4-53、在下图所示的类图中,BookStore类和Station类之间是限定关联,则BookStore类中的声明最可能类似于下面哪种形式?



答案:


(C)


因为BookStore类中使用了限定符sattionID,对Station类的对象进行划分,所以BookStore类的方法中需要使用sattionID作为参数,进行Station类的对象的筛选。


4-54、在下图所示的类图中,工程师(Engineer)根据他们的工作时间可以分为全日职的(FullTime)和兼职的(PartTime)两种。根据他们的专业可以分为软件工程师和硬件工程师。在初始设计中,整个类层次结构没有灵活性。如果要增加一种新专业的工程师,则在类FullTimeEngineer和类PartTimeEngineer下面都要增加子类。如果要改进这种设计,以便能够很容易地增加新的专业的工程师,则在方案(A)~(D)中,哪种设计最合理?


答案:


(B) 方案(B),事实上就是“抽象工厂”设计模式。当需要增加一种新专业的工程师时,可以在Specialty类下面新增一个对应的子类。


4-55、参考下图,试分析下面哪种叙述是正确的?



答案:


(D)


首先,HelloWorld类继承了Applet类,Applet类继承了Panel类,Panel类继承了Container类,Container类继承了Component类,Component类继承了Object类。


其次,ImageObserver是接口,Component类实现了该接口的方法


4-56、参考下图,试分析下面哪种叙述是不正确的?



答案:


不正确的是(A)、(C)。 方案(A)强调“每门课程(Course),只能有一个教师(Instructor)讲授”,所以课程(Course)类和教师(Instructor)类的关联关系上,Instructor类的那端的多重性必须是“1”,但类图中是“n”。所以(A)描述的与事实不符。 方案(C)强调“一个教师可以是一个或多个系(Department)的系主任(Chairperson)”,所以教师(Instructor)类和系(Department)类的关联关系上,Department类的那端的多重性必须是“n”,但类图中是“0..1”。所以(C)描述的与事实不符。这里,Instructor类的那端的“+chairperson”,代表“角色”。


4-57、参考下图,试分析下面哪种叙述是正确的?




答案:


正确的是(B)、(D)。 Button类可以继承RectangularIcon类中的height和width属性。同样的,OKButton类可以继承Button类中的height和width属性,而这两个属性正好是RectangularIcon类的。所以,方案(B)是正确的。 当父类定义了一个方法,子类可以继承父类的这个方法,也可以修改父类的这个方法的实现代码,这就是覆盖的定义。也是“继承”的精髓所在。所以,方案(D)是正确的。


4-51、某库存管理系统的类图如下图(原始类图)所示。

如果有新的需求:

(1)对已经损坏(damaged)的货物的价格进行打折;


(2)可以按货物的大小和颜色对货物进行查找。那么,根据下面的方案A~方案D,应该如何修改类图中相应的类比较好?为什么?图方案(A)~方案(D)中的isDamaged()方法可以判断一个货物是否已经损坏;location()方法返回货物所存放的具体位置。


方案(A):增加类InventoryProduct的属性和方法,如图方案(A)所示,原始类图中其余的部分不变。


方案(B):增加一个新的类PhysicalProduct,用来表示仓库中具体的货物,并在类PhysicalProduct和类InventoryProduct之间建立关联关系,如图方案(B)所示,原始类图中其余的部分不变。


方案(C):增加类Inventory的属性和方法,如图方案(C)所示,原始类图中其余的部分不变。


方案(D):同时增加类InventoryProduct和类Inventory的属性和方法,如图方案(D)所示,原始类图中其余的部分不变。




答案:


(B) 同一产品目录(InventoryProduct类)会对应多个产品(指具体的对象),其中某些产品可能是损坏的,某些产品可能是好的。在InventoryProduct类中增加isDamaged()方法进行直接判断并不是很好的方案。 方案(B),在产品目录(InventoryProduct类)中只反映产品种类及每个产品的一些重要参数。在具体产品(physicalProduct类)中判断每个具体的产品对象“是否损坏”,是比较合理的设计方案。从而将产品与产品目录分离开了。


4-50、某书店库存管理系统的类图如下,在这些类:LineItem,Station,Payment,Sale中,由谁负责创建Transaction类最合理?为什么?



答案:


由Station类负责创建Transaction类最合理。 LineItem类和Payment类与Transaction类都是“多对1”的关系,因此由它们来负责创建Transaction类要记录是哪个具体的对象完成了此任务。这会增加系统的耦合度。 Sale类是Transaction类的子类,由子类负责创建父类不是好的设计方案。


目录
相关文章
《面向对象分析与设计》一3.1 系统边界
本节书摘来自华章出版社《面向对象分析与设计》一书中的第3章,第3.1节,作者 麻志毅,更多章节内容可以访问云栖社区“华章计算机”公众号查看
3411 0
|
9月前
|
uml
UML 面向对象技术
UML 面向对象技术
|
6月前
|
领域建模 uml
面向对象分析与设计
一、面向对象分析与设计 面向对象分析与设计(Object-oriented Analysis and Design,简称OOAD)是一种软件开发方法论,旨在通过将现实世界的问题抽象为对象的集合来进行系统分析和设计。 面向对象分析(Object-oriented Analysis,简称OOA)是指通过识别和描述系统中的对象及其相互关系来分析问题。在面向对象分析中,重点关注的是问题域中的实体、属性、行为以及它们之间的关系。通过对问题域的深入理解,可以识别出系统中的关键对象,并确定它们的属性和行为。 面向对象设计(Object-oriented Design,简称OOD)是指根据面向对象分析的结果,
88 0
|
9月前
|
数据可视化 uml
UML——面向对象技术
封装(Encapsulation):隐藏对象的属性和实现细节,仅对外提供公共访问方式,提高复用性和安全性
|
9月前
|
uml
【UML】面向对象技术
【UML】面向对象技术
40 0
|
11月前
|
传感器 测试技术 数据库
面向对象分析与设计_用例图
面向对象分析与设计_用例图
609 0
|
uml
【UML建模】(3) UML建模之类图
类图是显示一组类、接口以及它们之间关系的图
308 0
【UML建模】(3) UML建模之类图
|
设计模式 存储 算法
设计模式(一),UML 类图设计
设计模式(一),UML 类图设计
|
设计模式 Java uml
【Java设计模式】UML类图六大关系总结(含代码)(二)
【Java设计模式】UML类图六大关系总结(含代码)(二)
【Java设计模式】UML类图六大关系总结(含代码)(二)
|
设计模式 Java uml
【Java设计模式】UML类图六大关系总结(含代码)(一)
【Java设计模式】UML类图六大关系总结(含代码)(一)
【Java设计模式】UML类图六大关系总结(含代码)(一)