聚合(Aggregation)关系是用来表示整体与部分关系的关联
- 格式:ppt
- 大小:420.50 KB
- 文档页数:44
继承、实现、依赖、关联、聚合、组合的联系与区别分别介绍这几种关系:继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java 中此类关系通过关键字extends明确标识,在设计时一般没有争议性;实现指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;依赖可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;关联他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;聚合聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;组合组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;聚合跟组合其实都属于关联只不过它们是两种特殊的关联因为本是同根生所以它们之间难免会有相似之处下面让我们一起来看一下它们之间有何不同聚合与组合的概念相信不用我在此赘述大家就已经了解了下面直接上例子程老师的《大话》里举大那个大雁的例子很贴切在此我就借用一下大雁喜欢热闹害怕孤独所以它们一直过着群居的生活这样就有了雁群每一只大雁都有自己的雁群每个雁群都有好多大雁大雁与雁群的这种关系就可以称之为聚合另外每只大雁都有两只翅膀大雁与雁翅的关系就叫做组合有此可见聚合的关系明显没有组合紧密大雁不会因为它们的群主将雁群解散而无法生存而雁翅就无法脱离大雁而单独生存——组合关系的类具有相同的生命周期聚合关系图:组合关系图:从从代码上看这两种关系的区别在于:构造函数不同雁群类:[csharp]view plaincopy1.public class GooseGroup2. {3.public Goose goose;4.5.6.public GooseGroup(Goose goose)7. {8.this.goose = goose;9. }10. }[csharp]view plaincopy1.public class GooseGroup2. {3.public Goose goose;4.5.6.public GooseGroup(Goose goose)7. {8.this.goose = goose;9. }10. }大雁类:[csharp]view plaincopy1.public class Goose2.{3.public Wings wings;4.5.public Goose()6. {7. wings=new Wings();8. }9.}[csharp]view plaincopy1.public class Goose2.{3.public Wings wings;4.5.public Goose()6. {7. wings=new Wings();8. }9.}聚合关系的类里含有另一个类作为参数雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来大雁类(Goose)可以脱离雁群类而独立存在组合关系的类里含有另一个类的实例化大雁类(Goose)在实例化之前一定要先实例化翅膀类(Wings)两个类紧密耦合在一起它们有相同的生命周期翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在信息的封装性不同在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。
类之间的⼏种关系类之间的关联关系UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系⼜可以细化为聚合和组合。
⼀、泛化(Generalization)泛化是⽗类和⼦类之间的关系,⼦类继承⽗类的所有结构和⾏为。
在⼦类中可以增加新的结构和⾏为,也可以覆写⽗类的⾏为。
⼀般⽤⼀个带空⼼箭头的实线表⽰泛化关系,UML图如下:泛化对应Java中继承关系,即⼦类继承⽗类中出private修饰外的所有东西(变量、⽅法等)。
⽰例代码:public class Animal {}public class Tiger extends Animal {}Tiger继承Animal,因此Tiger与Animal之间是泛化(继承)关系。
这个很好理解。
⼆、依赖(Dependency)依赖关系是⼀种使⽤关系,特定事物的改变有可能会影响到使⽤该事物的事物,反之不成⽴。
在你想显⽰⼀个事物使⽤另⼀个事物时使⽤。
⼀般⽤⼀条指向被依赖事物的虚线表⽰,UML图如下:通常情况下,依赖关系体现在某个类的⽅法使⽤另⼀个类作为参数。
代码⽰例:public class Screwdriver { //螺丝⼑,作为⼈类的⼯具,是⽤来被⼈类使⽤的}public class Person{public void screw(Screwdriver src){ //拧螺丝,需使⽤螺丝⼑}}Person类的screw()⽅法在使⽤时就得传⼊⼀个Screwdriver类型的参数,这样Screwdriver的改变就会影响到Person,因此Person与Screwdriver之间就是依赖关系(Person依赖于Screwdriver)。
三、关联(Association)是⼀种结构关系,说明⼀个事物的对象与另⼀个事物的对象相联系。
给定有关联的两个类,可以从⼀个类的对象得到另⼀个类的对象。
关联有两元关系和多元关系。
两元关系是指⼀种⼀对⼀的关系,多元关系是⼀对多或多对⼀的关系。
继承、实现、依赖、关联、聚合、组合的联系与区别分别介绍这几种关系:继承实现指的是一个class 类实现interface 接口(可以是多个)的功能;实现是类与接口之间最常 见的关系;在Java 中此类关系通过关键字implements 明确标识,在设计时一般没有争 议性;依赖可以简单的理解,就是一个类A 使用到了另一个类B ,而这种使用关系是具有偶然性的、、 临时性的、非常弱的,但是B 类的变化会影响到A ;比如某人要过河,需要借用一条船, 此时人与船之间的关系就是依赖;表现在代码层面,为类B 作为参数被类A 在某个method 方法中使用;Inte rfare指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可 以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java 中此类关系通过关键字extends 明确标识,在设计时一般没有争议性;b lnterface_BQlass_A ClaSs_B关联他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这 种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而 且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B 以类属性的形式出现在关联类A 中,也可能是关联类A 引用了一个类型为被关联类B 的全 局变量;聚合聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a 的关系,此 时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象, 也可以为多个整体对象共享;比如计算机与CPU 、公司与员工的关系等;表现在代码层面, 和关联关系是一致的,只能从语义级别来区分;组合组合也是关联关系的一种特例,他体现的是一种contains-a 的关系,这种关系比聚合更强, 也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生 命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联 关系是一致的,只能从语义级别来区分;对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向 关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区 分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别Cl3ss A 十 depend<Qlass.B classBJ ;:;;VoidClass_B的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联》依赖;聚合跟组合其实都属于关联只不过它们是两种特殊的关联因为本是同根生所以它们之间难 免会有相似之处下面让我们一起来看一下它们之间有何不同聚合与组合的概念相信不用我在此赘述大家就已经了解了下面直接上例子 程老师的《大话》里举大那个大雁的例子很贴切在此我就借用一下大雁喜欢热闹害怕孤独所 以它们一直过着群居的生活这样就有了雁群每一只大雁都有自己的雁群每个雁群都有好多 大雁大雁与雁群的这种关系就可以称之为聚合另外每只大雁都有两只翅膀大雁与雁翅的关 系就叫做组合有此可见聚合的关系明显没有组合紧密大雁不会因为它们的群主将雁群解散 而无法生存而雁翅就无法脱离大雁而单独生存一一组合关系的类具有相同的生命周期聚合关系图:构造函数不同雁群类:[csharp] view plaincopypublic class GooseGroup { public Goose goose; public GooseGroup(Goose goose) { this .goose = goose;} 10. }[csharp] view plaincopy1. 2. 3.4.5. 6.7. 8.9. 组合关系图:从从代码上看这两种关系的区别在于:1.public class GooseGroup2.{3.public Goose goose;4.5.6.public GooseGroup(Goose goose)7.{8.this.goose = goose;9.}10.}大雁类:[csharp] view plaincopy1.public class Goose2.{3.public Wings wings;4.5.public Goose()6.{7.wings=new Wings();8.}9.}[csharp] view plaincopy1.public class Goose2.{3.public Wings wings;4.5.public Goose()6.{7.wings=new Wings();8.}9.}聚合关系的类里含有另一个类作为参数雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来大雁类(Goose)可以脱离雁群类而独立存在组合关系的类里含有另一个类的实例化大雁类(Goose)在实例化之前一定要先实例化翅膀类(Wings)两个类紧密耦合在一起它们有相同的生命周期翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在信息的封装性不同在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。
一、名词解释(共6小题,每题4分,共24分)1、多重继承答:指得是一个类可能有多个基类,是从多个类继承得来的2、聚集(Aggregation)答:聚集(Aggregation)是表达主体部分关系的关联,它用在聚合端的菱形符号来表示。
如桌子和桌腿的关系。
3、类图!答:反映类及类之间关系的视图。
4、持久对象答:可通过对象标识来访问的对象因其能够被保存在持久性存储器中,因而被称为持久性对象,其生存周期超出了应用程序的一次性运行时间。
5、关联答:描述链集合的一种结构关系,其中链是对象之间的连接;它是与实例间连接相关的两个或多个类元之间的语义关系。
-6、组成(Composition)答:组成(Composition)是关联的更强的形式,具有管理组成部分的特有责任,如组成部分的分配和释放。
如树和树叶的关系。
另外,离开整体后部分不能独立存在或者失去意义。
1、下图是某个系统的类图表示。
请指出图中用箭头标出的四处位置的含义分别是什么答:1是泛化关系,2是1对多的关联关系,3是1对1的关联关系,4是组成关系。
2、列举使用UML进行建模时用到的静态结构模型答:用例图、对象图、类图、组件图、部署图是静态结构模型、5、分析说明为什么面向对象的开发方法为软件复用技术提供了良好的环境答:面向对象方法之所以特别有利于软件复用,是由于它的主要概念及原则与软件复用的要求十分吻合。
支持复用的OO 概念与原则是:对象与类、抽象、封装、继承与一般——特殊结构、整合与整体——部分结构、粒度控制、多态性。
对象与类:OO 方法用对象描述问题域中的事务,并用类作为同种对象的抽象表示。
类是系统的基本构成单位,它符合可复用构件所应具备的那些特性:完整性、独立性、可标识性、一般性。
抽象、封装:尤其是OO 方法的对象封装性,为软件复用技术提供了良好的条件。
四、综合题(共3小题,每题10分,共30分)1、问题描述为:建立图书信息管理系统。
系统要求实现以下功能:1)用户管理功能,包括读者信息的录入、修改、更新,以及登录等。
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现1.2.3.4.5.6.类与类图1 类(Class封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。
2 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。
一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。
3 类的属性即类的数据职责,类的操作即类的行为职责一、依赖关系(Dependence依赖关系(Dependence):假设A类的变化引起了B 类的变化,则说名B类依赖于A类。
• 依赖关系(Dependency 是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
• 在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
[java] view plaincopyprint?1. public class Driver2. {3. public void drive(Car car4. {5. car.move(;6. }7. ……8. }9. public class Car10. {11. public void move(12. {13. ......14. }15. ……16. }{car.move(;}……}public class Car{public void move({......}……}依赖关系有如下三种情况:1、A类是B类中的(某中方法的)局部变量;2、A类是B类方法当中的一个参数;3、A类向B类发送消息,从而影响B类发生变化;GeneralizationGeneralization A是B和C的父类,B,C具有公共类(父类)A,说明A是B,C的一般化(概括,也称泛化)• 泛化关系(Generalization也就是继承关系,也称为“is-a-kind-of”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。
什么是面向对象设计面向对象设计是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。
从面向对象分析到面向对象设计,是一个逐渐扩充模型的过程。
面向对象设计是模仿现实生活处理问题的思维和方式来解决软件开发问题,首先根据需要解决的问题和功能进行抽象把他看作是一个具体的事物同时给他添加相应的属性和行为服务,这样就可以像日常生活里遇到问题一样按照自己的思维方式来解决并把这些思维方式直接映射到代码里。
面向对象系统的特点封装性封装是指将一组数据和与这组数据有关的操作放在一起,形成一个能动的实体——对象。
封装是一种通过定义严格的外部接口在单独编写的模块之间减少相互依赖的技术。
一个对象要具有封装性,应具备如下几个条件:1. 具有一个清楚的边界。
2. 具有一个接口。
3. 对象内部的属性和实现代码受到封装壳的保护。
面向对象系统的封装性是一种信息隐藏技术,它使系统设计员能够清楚地表明他们所提供的服务界面,用户和应用程序员则只能看见对象所提供的服务,而看不到其中的数据和操作代码细节。
对象的封装机制的目的在于将对象的使用者和设计者分开。
除了对象的封装以外,类概念本身也具有一种封装意义,它将数据和与这个数据有关的操作集合封装在一起。
继承性继承是一个对象可以获得另一个对象的特性的机制,它支持层次分类的概念。
将被继承的对象称为基类或父类,而继承的对象称为派生类或子类。
如果父类中的某些行为不适用于子类,则只需对这些操作的实现部分加以修改和重写,以满足子类的要求。
父类可以继承其它的类,子类也可以被别的类所继承,从而形成类的继承层次关系,也称为类层次。
若一个类只有一个父类,则称为单继承,这样建立起来的类类层次形成了一个树。
当一个类有多于一个基类时,则称为多重继承。
采用继承性的语言具有如下的优点:1. 提高了软件的重用性。
2. 符合逐步求精的软件工程原则。
3. 便于实现多态性。
4. 便于系统的扩展。
5. 类层次反映了现实世界中普遍存在的一般与特殊的关系,也反映了人类认识世界的演绎方法。
abstract class 抽象类,提供一组子类共有行为的类,但它本身并不具有实例。
抽象类表示一个概念,从中派生的类代表对这一概念的实施。
Abstraction 抽象,对视图或模型的创建,其中忽略了不必要的细节,以便专注于一组特定的相关细节。
access modifier存取权限,对类、方法或属性进行访问控制的关键字。
Java 中的存取权限可以是公有、私有、保护和包装(默认)。
accessor methods存取器方法,由对象提供的、用于定义连接该对象实例变量的方法。
用来返回实例变量值的存取器方法被称为获取方法;用来为实例变量指定值的存取器方法被称为设置方法。
acceptance验收,客户接受软件产品(作为部分或完整履行合同的结果)所有权的操作。
action动作,对构成计算过程抽象的可执行语句的规范。
动作通常会导致系统状态发生变化,这是通过向一个对象发送消息或是更改链接或属性值来实现。
action sequence动作序列,解析为一系列先后发生的动作的表达式。
action state动作状态,表示不可分动作的执行状态,通常指的是调用一个操作。
activation激活,动作的执行active class主动类,表示系统中控制线程的类。
请参见主动对象。
activity活动,要求角色执行的工作单元。
active object主动对象,拥有线程并可发起控制活动的对象。
主动类的实例。
activity graph活动图,状态机的特例,用于对涉及一个或多个分类器的进程建模。
对比:状态图(statechart diagram)。
同义词:活动图(activity diagram)。
actor主角,系统之外与系统交互的某人或某事物。
actor class主角类,定义一组主角实例,其中每个主角实例相对于系统而言都担任着同样的角色。
在与用例交互时这些用例的用户所担任的一组紧密相关的角色。
主角为每个要与其通信的用例都准备了一个角色。
面向对象程序设计中的聚合与组合关系面向对象程序设计(Object-Oriented Programming,OOP)是一种广泛应用的程序设计范式,它以对象作为程序的基本单元,将相关数据和方法封装在一起。
在OOP中,对象之间的关系通常可以分为聚合和组合两类。
本文将对这两种关系进行详细讲解。
一、聚合(Aggregation)聚合是指一个对象包含另一个对象,且被包含对象可以独立存在。
例如,一个图书馆包含多个书籍,但是这些书籍可以独立存在,也可以属于其他图书馆。
在UML类图中,聚合关系通常用空心的菱形箭头表示。
聚合关系的特点是:1. 被聚合对象与聚合对象之间是“整体-部分”的关系。
2. 被聚合对象可以独立存在,即该对象的生命周期不会受到聚合对象的生命周期的影响。
3. 一个聚合对象可以包含多个被聚合对象,但一个被聚合对象只能属于一个聚合对象。
4. 聚合关系通常是动态变化的,即一个对象可以在多个聚合对象之间移动。
例如,下面是一个简单的图书馆类:```javapublic class Library {private String name;private List<Book> books;public Library(String name) { = name;books = new ArrayList<>();}public void addBook(Book book) {books.add(book);}public void removeBook(Book book) {books.remove(book);}}```这个类中包含一个书籍列表,即聚合了多个Book对象。
但是,每个书籍可以独立存在,不受图书馆的限制。
二、组合(Composition)组合是指一个对象包含另一个对象,且被包含对象不能独立存在,它们是“整体-部分”的关系。
例如,一个汽车包含多个轮子,但是一个轮子不能独立存在。
UML类图中的符号解释在UML的定义中,描述类和对象之间的关系,包括以下⼏种⽅式:依赖(Dependency)、关联(Association)、聚合(Aggregation)、组合(Composition)、泛化(Generalization)和实现(Realization)。
现分别说明如下:1. 依赖(Dependency)在uml中,“依赖”表⽰为带箭头的虚线,箭头指向被依赖的元素。
是类与类之间的连接,表⽰为⼀个类依赖于另⼀个类的定义,其中⼀个类的变化将影响另⼀个类。
依赖总是单向的,不应该存在双向依赖,这⼀点要特别注意。
更具体的说,依赖可以理解为:⼀个类(A)对不在其实例作⽤域内的另⼀个类或对象(B)的任何类型的引⽤。
⼤致包含以下⼏种情况:(1)局部变量;(2)⽅法的参数;(3)静态⽅法的调⽤;下⾯是依赖关系的uml⽰意图:2. 关联(Association)在uml中,关联表⽰为带箭头的实线。
关联可以是单向的,也可以是双向的。
如果是双向关联,则可以表⽰为双向箭头,或者没有箭头。
⼀般来说,系统设计应表现为单向关联,这样利于维护。
⼀个关联可以附加“多重性”的修饰符,表⽰两个类之间的数量关系。
关联可以理解为:⼀个类(A)持有另⼀个类或对象(B)。
具体表现为:(1)成员变量下⾯是关联关系的uml⽰例图:上⾯的关联表⽰,⼀个Employee持有(has)0个或多个TimeCard。
3. 聚合(Aggregation)在uml中,聚合关系表⽰为空⼼的菱形箭头线。
聚合关系是关联关系的⼀种,表⽰⼀种“强”关联关系。
对⽐与关联关系,两个类是处于同⼀个层次的。
⽽聚合关系,两个类处于不同的层次,强调了⼀个整体/局部的关系。
例如⼀辆汽车有⼀个引擎,4个轮胎。
在聚合关系中,体现了⼀种“弱拥有”的概念。
也就是说,对象A拥有对象B,但B并不是A的组成部分。
更具体的表现为,如果A由B聚合⽽成,则A包含B的全局对象,但B对象可以不在A对象创建时创建。
信息系统项目管理师考试辅导教程(第3版)第4章面向对象方法第4章面向对象方法结构化分析和设计方法在一定葙度上缓解了“软件危机”。
但随着人们对软件提出的要求越来越高,结构化方法己经无法承担快速高效开发复杂软件系统的重任。
2 0世纪80年代逐渐成熟的面向对象方法学,使软件开发者对软件的分析、设计和编程等方面都有了全新的认识。
由于“对象”概念的引入,将数据和方法封装在一起,提高了模块的聚合度,降低了模块的耦合度,更大程度上支持了软件重用,从而十分有效地降低了软件的复杂度,提高了软件开发的生产率。
目前,面向对象方法学已成为软件开发者的第一选择。
根据考试大纲,本章要求考生掌握以下知识点:面向对象的基本概念;统一建模语言UML;可视化建模;面向对象系统分析;面向对象系统设计。
4.1面向对象的基本概念为了讨论面向对象(Object-Oriented,0 0)的技术和方法,必须首先明确什么是“面向对象”?为什么要讨论面向对象的方法?什么是对象?对于这些问题,有许多不同的看法。
其中Booch、Coad/Y ourdon和Jacobson的方法在面向对象软件开发界得到了广泛的认可。
特别值得一提的是统一建模语言(UML,Unified Modeling Language),该方法结合了Booch、OMT和Jacobson方法的优点,统一了符号体系,并从其他的方法和工程实践中吸收了许多经过实践检验的概念和技术。
Peter Coad和Edward Y ourdon曾提出了下列等式:面向对象=对象(Objects)+类(Classes)+继承(Inheritance)+消息通信(Communication with Messages)4.1.1对象与封装对象(Object)是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。
面向对象的软件系统是由对象组成的,复杂的对象由比较简单的对象组合而成。
也就是说,面向对象方法学使用对象分解取代了传统方法的功能分解。