类和类之间的关系 类的设计原则

合集下载

面向对象中类和类的关系

面向对象中类和类的关系

⾯向对象中类和类的关系在⾯向对象⽅法中,我们在确定了类及类的属性和⽅法后。

不可避免的要研究类和类之间的关系,正是这些关系将整个事情串联起来。

使彼此之间有了联系,就像现实⽣活中,⼈与⼈交往中存在着不同的关系。

了解这些关系,对于我们开发系统百利⽽⽆⼀害,能够让我们轻松、⾼效的⼯作,相同像我们在⽇常⽣活中处理好⼈与⼈之间的关系。

会给我们带来巨⼤的优点。

那么我们就来认识⼀下。

⾯向对象中类与类之间有那些关系。

类和类之间的关系⼤概能够分为⼀下⼏种类型:泛化关系(Generalization)、实现关系(realization)、依赖关系(Dependency)、关联关系(Association)(关联、聚合(Aggregation)、组合(Composition))。

泛化关系和实现关系体现的是⼀种类和类、或者类和接⼝间的关系。

不存在引⽤,归结为纵向关系。

依赖关系和关联关系体现的是类和类、类与接⼝间的引⽤。

归结为横向关系。

⼀、泛化关系泛化关系是⼀个类(⼦类、⼦接⼝)继承另外的⼀个类(⽗类、⽗接⼝)的功能,⽽且能够有⾃⼰的新功能。

也既是我们所说的继承关系。

在java中通过extends来标识。

在UML中⽤⼀条带空⼼箭头的实现表⽰,从⼦类指向⽗类,或者⼦接⼝指向⽗接⼝。

代码例如以下:Class _A{}Class _B extends _A{}Public class Test{Public static void main(String args[]){_A a = new _B();}}⼆、实现关系实现关系指的是class类实现interface接⼝(能够使多个接⼝)。

在java中⽤implements标识,在UML中⽤⼀条带空⼼三⾓箭头的虚线标识,从类指向实现的接⼝。

代码例如以下:Interface A{}Class B implements A{}Public class Test{Public static void main( String args[] ){B b = new B();}}说明:以上泛化和实现为⼀对,两者都⽤空⼼三⾓形。

类的设计

类的设计

类设计方法(1)作者:来源:发布时间:07-12-26 浏览:次通常,类中的对象具有相同的属性和操作。

因此,应当建立一个机制来表示类中对象的数据结构、处理定义和引入过程。

这时,类的设计是由数据模型化、功能定义和ADT定义混合而成的。

类是某些概念的一个数据模型,类的属性就是模型中的数据域,类的操作就是数据模型允许的操作。

要明确规定它们两个谁先确定是不可能的,两个处理是互补的。

类的标识有主动和被动之分。

被动类是数据为中心的,它们是根据系统的其他对象发送来的消息而修改其封装数据模型的;主动类则提供许多系统必须履行的基本操作。

与被动类的实例(被动对象)一样,主动类的实例(主动对象)接收消息,但这些对象是负责发送附加消息和控制某些应用部分的。

在窗口环境,一个窗口对象是一个被动对象,窗口是基于发送给窗VI的消息来显示某些内容的。

窗口管理器是一个主动对象,它担负着各种在它控制的窗口上的操作。

在被动类与主动类的设计之间不存在明显的差别。

在设计主动类时,需要优先确定数据模型,稍后再确定操作;在设计被动对象时,把类提供的服务翻译成操作。

在标识了服务之后再设计为支持服务所需要的数据。

许多类都是这两个极端的混合。

类中对象的组成包括了public(共享界面)、operation(操作)和private(私有数据结构)。

而消息则通过界面,执行控制和过程性命令。

因此,类的设计描述包括两部分:(1)协议描述(protocol description)协议描述定义了每个对象类可以接收的消息,建立一个类的界面。

协议描述由一组消息及对每个消息的相应注释组成。

例如,类motion sensor的一部分协议描述:MESSAGE(motion sensor)—read:RETURNS sensor ID,sensor status;读sensor时要求的消息MESSAGE(motion sensor)-set:SENDS sensor ID。

UML类图及类与类之间的关系

UML类图及类与类之间的关系

UML类图及类与类之间的关系原⽂地址:类图⽤于描述系统中所包含的类以及它们之间的相互关系,帮助⼈们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。

1. 类类(Class)封装了数据和⾏为,是⾯向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。

在系统中,每个类都具有⼀定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务。

⼀个类可以有多种职责,设计得好的类⼀般只有⼀种职责。

在定义类的时候,将类的职责分解成为类的属性和操作(即⽅法)。

类的属性即类的数据职责,类的操作即类的⾏为职责。

设计类是⾯向对象设计中最重要的组成部分,也是最复杂和最耗时的部分。

在软件系统运⾏时,类将被实例化成对象(Object),对象对应于某个具体的事物,是类的实例(Instance)。

类图(Class Diagram)使⽤出现在系统中的不同类来描述系统的静态结构,它⽤来描述不同的类以及它们之间的关系。

在系统分析与设计阶段,类通常可以分为三种,分别是实体类(Entity Class)、控制类(Control Class)和边界类(Boundary Class),下⾯对这三种类加以简要说明:(1) 实体类:实体类对应系统需求中的每个实体,它们通常需要保存在永久存储体中,⼀般使⽤数据库表或⽂件来记录,实体类既包括存储和传递数据的类,还包括操作数据的类。

实体类来源于需求说明中的名词,如学⽣、商品等。

(2) 控制类:控制类⽤于体现应⽤程序的执⾏逻辑,提供相应的业务操作,将控制类抽象出来可以降低界⾯和数据库之间的耦合度。

控制类⼀般是由动宾结构的短语(动词+名词)转化来的名词,如增加商品对应有⼀个商品增加类,注册对应有⼀个⽤户注册类等(3) 边界类:边界类⽤于对外部⽤户与系统之间的交互对象进⾏抽象,主要包括界⾯类,如对话框、窗⼝、菜单等。

在⾯向对象分析和设计的初级阶段,通常⾸先识别出实体类,绘制初始类图,此时的类图也可称为领域模型,包括实体类及其它们之间的相互关系。

第11章面向对象的设计与实现一、填空题(30小题)1、类型一致性原则

第11章面向对象的设计与实现一、填空题(30小题)1、类型一致性原则

第11章面向对象的设计与实现一、填空题(30小题)1、类型一致性原则要求子类S必须满足6个限制条件:( )、( )、( )、( )、( )和( )。

答案:S的状态空间(State-space)必须与T的状态空间一致(但S可以拥有额外空间以延伸T的状态空间)、在S和T的共享空间中,S的状态空间必须等同于或位于T的状态空间之内。

对于T的每一操作(如T.叩),S覆盖或重定义为S.op,则:S.Op必须与T.op名称相同、S.op的形式函数原型的参数必须与T.op的形式函数原型的参数表一一对应、S.op 的前置条件必须等同于或弱于T.op的前置条件、S.op的后置条件必须等同于或强于T.op 的后置条件2、类的实例化是( )。

答案:对象3、对象之间进行通信的构造叫做( )。

答案:消息4、闭合行为原则是指:( )。

答案:在基于类型/子类型层次结构的继承层次结构中,类C的任何对象操作的执行,包括从C的超类继承的所有操作应满足C的类不变式5、类型( )对于创建类库的类层次结构至关重要。

答案:一致性原则6、输出端是指( )。

答案:通过一个给定程序的多行代码来测量引用其他程序的次数7、不同应用中信息共享的这种机制和构造是通过( )来实现的。

答案:类库8、类型一致性设计原则可表述为( )。

答案:如果S为T的真子类型,则S必须与T一致,即类型S的对象可以出现在类型T的对象所需要的任何环境中,并且当该对象的任何获取操作执行时,仍能保持其正确性9、耦合性用来度量( )。

答案:程序之间联系的次数和强度10、没有经过封装的原始代码规定为( )封装。

答案:0级11、一个( )可以具体实现为多个类,每个类又包括自己独特的内部设计。

答案:类型12、受限关联由两个类和一个( )组成。

答案:限定词13、类具有属性,描述类的属性用( )。

答案:数据结构14、一个标准的面向对象系统包含的类通常来自于4个主要领域:( )。

(1)基础领域包含了( )。

类与类之间的关系(继承、实现、依赖、关联、聚合、组合)

类与类之间的关系(继承、实现、依赖、关联、聚合、组合)
实例
唐僧与徒弟是单向关联 徒弟与悟空、悟能、悟净是双向关联
聚合
当对象A被加入到对象B中,成为对象B的组成部分时, 对象B和对象A之间为聚合关系。聚合关系是关联关系的 一种,是强的关联关系。聚合是整体去个体之间的关系。 此时的整体与部分之间是可分离性的它们各自具有自己 的生命周期,部分可以属于多个整体对象,也可以为多 个整体对象共享。
强弱关系为: 组合>聚合>关联>依赖
实例: 当你要渡河时,就必须要调用船类
中的渡河方法。这就是依赖

船类 渡河
关联
两个相对独立的对象,当一个对象的实例与另一个对象的特定 实例存在固定关系时,就存在关联。亦是一种强的依赖性。不 存在依赖的偶然性、临时性。是长时性的。而且双方是平等的。 可以是单向的、也可以是双向的。
单向关联
类A认识类B,类A知道类B的存在,类A可以调用类B的方法。 代码表现:类A中有类B的变量或引用。
public class abstract Parents{ public abstract void method();
}
public class Child extends Parents{ public void method(){
} }
属性 方法
接口
接口就是在接口中写出方法,然后在调用接口类 时实现所有接口类中方法。java中通过 interface来表示接口。其一个类可以实现多个 接口,用implement来实现接口,用“,”来 连接多个接口。接口不能够被实例化。
组合也是关联关系的一种它是比聚合更加体现整体与个体之间的关系的整体与个体是不可分的当整体结束时个体就意味着结束个体离开整体时将不能够生存
类与类之间的关系

类之间的耦合关系

类之间的耦合关系

类之间的耦合关系
耦合关系是软件工程中的一个重要概念,指的是不同类之间的依赖关系。

当一个类依
赖于另一个类时,它就与之存在耦合关系。

耦合关系的好坏与软件设计的质量密切相关,
好的耦合关系可以提高代码的可维护性和可重用性,而糟糕的耦合关系则可能导致代码脆弱、难以修改、难以理解和性能低下等问题。

1. 继承关系
继承是一种强耦合的关系,子类的实现依赖于父类的实现,并且随着需求的变化可能
会造成大范围的类修改。

因此,应该尽量避免过度的继承关系,而是使用组合、委托等方
式来实现代码复用。

2. 接口关系
接口是一种松耦合的关系,它定义了一个类应该实现的方法签名,而具体的实现则由
实现该接口的类来完成。

这种关系可以有效降低类之间的依赖关系,并提高代码的可维护
性和可重用性。

3. 依赖关系
依赖关系是一种短暂的关系,在一个类的方法中使用另一个类的对象作为参数、局部
变量或返回值时,这两个类就存在依赖关系。

依赖关系是一种必要的关系,但过度的依赖
会导致代码难以理解和修改。

4. 聚合关系
聚合关系是一种强引用的关系,它表示一个类对象包含了另一个对象,但这两个对象
的生命周期不同。

聚合关系可以提高代码的可重用性和可维护性,但过度使用聚合关系也
会导致类之间的耦合度过高。

总之,好的软件设计应该尽可能减少类之间的耦合关系,提高代码的可维护性、可扩
展性和可重用性,以便满足不断变化的需求。

在设计时,应该采用松耦合的关系,如接口、依赖倒置等设计模式,同时注意避免过度的继承、聚合和组合关系。

面向对象设计七大原则

面向对象设计七大原则

⾯向对象设计七⼤原则1. 单⼀职责原则(Single Responsibility Principle)每⼀个类应该专注于做⼀件事情。

2. ⾥⽒替换原则(Liskov Substitution Principle)超类存在的地⽅,⼦类是可以替换的。

3. 依赖倒置原则(Dependence Inversion Principle)实现尽量依赖抽象,不依赖具体实现。

4. 接⼝隔离原则(Interface Segregation Principle)应当为客户端提供尽可能⼩的单独的接⼝,⽽不是提供⼤的总的接⼝。

5. 迪⽶特法则(Law Of Demeter)⼜叫最少知识原则,⼀个软件实体应当尽可能少的与其他实体发⽣相互作⽤。

6. 开闭原则(Open Close Principle)⾯向扩展开放,⾯向修改关闭。

7. 组合/聚合复⽤原则(Composite/Aggregate Reuse Principle CARP)尽量使⽤合成/聚合达到复⽤,尽量少⽤继承。

原则:⼀个类中有另⼀个类的对象。

细则单⼀职责原则(Single Responsibility Principle)因为:可以降低类的复杂度,⼀个类只负责⼀项职责,其逻辑肯定要⽐负责多项职责简单的多;提⾼类的可读性,提⾼系统的可维护性;变更引起的风险降低,变更是必然的,如果单⼀职责原则遵守的好,当修改⼀个功能时,可以显著降低对其他功能的影响。

需要说明的⼀点是单⼀职责原则不只是⾯向对象编程思想所特有的,只要是模块化的程序设计,都适⽤单⼀职责原则。

所以:从⼤局上看Android中的Paint和Canvas等类都遵守单⼀职责原则,Paint和Canvas各司其职。

⾥⽒替换原则(Liskov Substitution Principle)因为:⾥⽒替换原则告诉我们,在软件中将⼀个基类对象替换成它的⼦类对象,程序将不会产⽣任何错误和异常,反过来则不成⽴,如果⼀个软件实体使⽤的是⼀个⼦类对象的话,那么它不⼀定能够使⽤基类对象。

类与类之间的关系图(ClassDiagram,UML图)

类与类之间的关系图(ClassDiagram,UML图)

类与类之间的关系图(ClassDiagram,UML图)展开全文一、简介二、类的构成三、类之间的关系(Relationship)1、单向关联2、双向关联3、自身关联4、多维关联(N-ary Association)5、泛化(Generalization)6、依赖(Dependency)7、聚合(Aggregation)8、组合(Composite)四、总结一、简介类是对象的集合,展示了对象的结构以及与系统的交互行为。

类主要有属性(Attribute)和方法(Method)构成,属性代表对象的状态,如果属性被保存到数据库,此称之为“持久化”;方法代表对象的操作行为,类具有继承关系,可以继承于父类,也可以与其他的Class进行交互。

类图展示了系统的逻辑结构,类和接口的关系。

二、类的构成类主要有属性和方法构成。

比如商品属性有:名称、价格、高度、宽度等;商品的方法有:计算税率,获得商品的评价等等。

如下图三、类之间的关系(Relationship)关联(Association)两个相对独立的对象,当一个对象的实例与另外一个对象的特定实例存在固定关系时,这两个对象之间就存在关联关系。

1、单向关联A1->A2: 表示A1认识A2,A1知道A2的存在,A1可以调用A2中的方法和属性场景:订单和商品,订单中包括商品,但是商品并不了解订单的存在。

类与类之间的单向关联图:C#代码:Public class Order{Public List<Product> order;Public void AddOrder(Product product ){order.Add(product);}}Public Class Product{}代码表现为:Order(A1)中有Product(A2)的变量或者引用2、双向关联B1-B2: 表示B1认识B2,B1知道B2的存在,B1可以调用B2中的方法和属性;同样B2也知道B1的存在,B2也可以调用B1的方法和属性。

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

• 关联体现的是两个类之间语义级别的一种强依赖关 系,比如我和我的朋友,这种关系比依赖更强、不 存在依赖关系的偶然性、关系也不是临时性的,一 般是长期性的,而且双方的关系一般是平等的。关 联可以是单向、双向的。表现在代码层面,为被关 联类B以类的属性形式出现在关联类A中,也可能 是关联类A引用了一个类型为被关联类B的全局变 量。在UML类图设计中,关联关系用由关联类A指 向被关联类B的带箭头实线表示,在关联的两端可 以标注关联双方的角色和多重性标记。
二、里氏代换原则(LSP) 1.一个软件实体假如行使的是一个父类的话,那么必然 合用于该子类,并且他发觉不出父类工具和子类工具的 区别。也就是说,在软件内里,把父类都替代成它的子 类,措施的举动没有变革。

【一句话】:子范例必需可以或许替代掉他们的父范例。
三、依靠倒置原则(DIP) 1.高层模块不该该依靠于底层模块。两个都应该依靠抽 象。2.抽象不该该依靠于细节,细节依靠于抽象( 【白话】:针对接口编程,不要针对实现编程。
四、接口断绝原则(ISP) 1.行使多个专门的接口比行使单一的总接口总要好。换 而言之,从一个客户类的角度来讲:一个类对其它一个 类的依靠性该当是成立在最小接口上的。 2.过于痴肥的接口是对接口的污染。不该该强制客户 依靠于它们不消的要领。
五、合成/聚合复用原则(CARP) 只管行使合成/聚合,只管不要行使类担任。 【聚合】:暗示一种弱的拥有相关,浮现的是A工具可 以包括B工具,但B工具不是A工具的一部门。 【合成】:一种强的拥有相关,提现了严格的部门和整 体的相关,部门和整体的保留周期同等。
六、迪米特法例(LoD) 起码常识原则 夸大类之间的松耦合。即:假如两个类不必互相直接通 讯,那么着两个类就不应当发送直接的彼此浸染。假如 个中一个类必要挪用另一个类的某一个要领的话,可以 通过圈外人转发这个挪用。
1.1 开-闭原则的定义和优点
定义: 一个软件实体应当对扩展开放,对修
改关闭。即在设计一个模块的时候,应当使这 个模块可以在不被修改的前提下被扩展。
面向对象设计的基本原则
"开放-关闭"原则(OCP) 在软件计划模式中,这种不能修改,但可以扩展的头脑 也是最重要的一种计划原则。即软件实体(类、模板、 函数等等)应该可以扩展,可是不行修改。 【普通】:计划的时辰,时候思量,只管让这个类是足 够好,写好了就不要去修改了,假如新需求来,我们增 进一些类就完事了,原本的代码能不动则不动。
1、抽象化是面向对象设计的第一个核心本质。 2、在面向对象编程中,通过抽象类及接口,规 定了具体类的特征作为抽象层,相对稳定,不 需修改, 从而满足“对修改关闭”;而从抽象 类导出的具体类可以改变系统的行为,从而满 足“对扩展开放”。 3、对实体进行扩展时,不必改变软件源代码或 者二进制代码。关键在于抽象。
2. 1 里氏替换原则
定义: 如果对每一个类型为T1的对象O1,都有类型为T2 的对象
O2,使得以T1定义的所有程序P在所有的对象O1都代换为O2时, 程序P的行为没有变化,那么类型T2是类型T1的子类型。
//... SE ai=new SE(); SE joe=new SE(); PM gates=new PM(); List<Employee> empl=new List<Employee>(); empl.Add(ai); empl.Add(joe); 子类可以替换父类 empl.Add(gates); //...
2. 1 里氏替换原则
定义: 如果对每一个类型为T1的对象O1,都有类型为T2 的对象
O2,使得以T1定义的所有程序P在所有的对象O1都代换为O2时, 程序P的行为没有变化,那么类型T2是类型T1的子类型。
//... SE ai=new SE(); SE joe=new SE(); PM gates=new PM(); List<Employee> empl=new List<Employee>(); empl.Add(ai); empl.Add(joe); 子类可以替换父类 empl.Add(gates); //...
优点:
a) 通过扩展的已有的软件系统,可以提供新的行为,以满足对软 件新的需求,使变化中的的软件有一定的适用性和灵活性。 b) 已有的软件模块,特别是最重要的抽象层模块不能被修改,这 就使变化中的软件系统有一定的稳定性和延续性。 c) 这样的系统同时满足了可复用性和可维护性。
1.2 如何实现“开-闭”原则
类和类之间的关系
实现 • 实现指的是一个class类实现interface 接口(可以是多个)的功能,实现是 类与接口之间最常见的关系。在Java 中此类关系通过关键字implements明 确标识,
继承 (Inherit)
是说子类获得父类的功能的同时,还可以 扩展自己的功能。 Java 代码表现为: extends 和 implements
聚合 (Aggregation)
聚合:指的是整体与部分的关系,如图 1-1 。 SoftwareCompany
IBM
Microsoft 图 1-1
Oracle
组合 (Composition)
组合:表示类之间整体和部分的关系,但是组合 关系中部分和整体具有统一的生存期,即整体对 象不存在,部分对象也将不存在,如图 1-2 。
类图
Parent(父类)
继承
Child(子类)
依赖Dependency
两个相对独立的A和B,当A负责构造B时,A 与B形成依赖关系,即A使用B。 Java 代码中的表现为局部变量,方法的参数, 以及对静态方法的调用。
Computer
依赖
Source
关联(Association)
两个相对独立的A和B,当A对象持有B对象的 时候,形成关联关系。 关联分为两种形式,聚合 (Aggregation) 和 组合 (Composition),聚合和组合只有概念 上的区别,在Java 中代码实现没有区别。
Computer 电脑
keyboard键盘
Mouse鼠标
显示器
图 1-2
组合也是关联关系的一种特例,它体现的是一种 contains-a的关系,这种关系比聚合更强,也称 为强聚合。它同样体现整体与部分间的关系,但 此时整体与部分是不可分的,整体的生命周期结 束也就意味着部分的生命周期结束,
第7章
相关文档
最新文档