| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> UML中的UML类图,面向对象原则和方法复用-java篇 -> 正文阅读 |
|
[Java知识库]UML中的UML类图,面向对象原则和方法复用-java篇 |
UML类图属于结构图,常被用于描述一个系统的静态结构。一个UML类图中通常包含类的UML图,接口的UML图,泛化关系的UML图,关联关系的UML图,依赖关系的UML图和实现关系的UML图。 类的UML图在类的UML图中,使用一个长方形描述一个类的主要构成,将长方形垂直地分为三层。 第1层是名字层,如果类的名字是常规字形,则表明该类是具体类;如果类的名字是斜体字形,则表明该类是抽象类。 如果变量的访问权限是 public,则需要在变量的名字前面用“+”符号修饰; 如果变量的访问权限是 protected,则需要在变量的名字前面用“#"符号修饰; 如果变量的访问权限是private,则需要在变量的名字前面用“-”符号修饰; 如果变量的访问权限是友好的,则变量的名字前面不使用任何符号修饰。
在用UML类时,可以根据设计需要只列出最重要的方法。 方法的访问权限是public,则需要在方法的名字前用的“+”号修饰; 方法的访问权限是?protected?,用“#”符号修饰; 方法的访问权限是private,用“-”符号修饰; 方法的访问权限是友好的,则方法的名字前面不使用任何符号修饰。 方法是静态方法,则在方法的名字下面添加下划线。 表示接口的UML图使用一个长方形描述一个接口的主要构成,分为3层。 接口中常量的访问权限都是public,在常量名字前用“+"?符号修饰。 泛化关系泛化关系(Generalization)?指类的继承关系。如果一个类是另一个类的子类,那么?UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束。 例如:Animal类和它的两个子类Dog和Cat的UML图 ? 关联关系如果A类中的成员变量是用B类(接口)来声明的变量,那么A和B的关系是关联关系(Association),称A关联于B.。如果A关联于B,那么?UML?通过使用一个实线连A和B的UML图,实线的起始端是A?的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示实线的结束。 例如:ClassRoom?类关联Light类的UML图。 ? 依赖关系??如果A类中某个方法的参数用B类(接口)来声明的变量或某个方法返回的数据类型是B类型,则A和B的关系为依赖关系,A依赖于B。如果A依赖于B,UML通过使用一个虚线连接A和B的UML图,虚线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示虚线的结束。 ClassRoom依赖Student接口的UML图 ?当需要强调A是通过方法参数依赖于B时,在UML图中使用虚线连接A和B的UML图 实现关系如果一个类实现了一个接口,那么类和接口的关系是实现关系(Realization),称类实现接口。UML通过使用虚线连接类和它所实现的接口,虚线的起始端是类,虚线的终点端是它实现的接口,但终点端使用一个空心的三角形表示虚线的结束。 ClassOne和ClassTwo类实现?Create接口的UML图 ?注释:UML使用注释(Annotation)为类图提供附加的说明。UML在一个带卷角的长方形中显示给出的注释,并使用虚线将这个带卷角的长方形和它所注释的实体连接起来。 例如:Computer类的UML图,该UML图使用注释对Computer类中的add()方法 ? 面向对象原则抽象类和接口
(4)做上转型对象:尽管抽象类不能用new运算符创建对象,但它的非abstract子类必须重写它的所有abstract方法,可以让抽象类声明的对象成为其子类对象的上转型对象,并调用于类重写的方法。 例如:抽象类A中有一个abstract方法add(int x,int y) A.java
B.java
Application.java
接口接口具有以下特点: (1)接口中有public权限的abstract方法,default方法和static方法 (2)接口由类实现,及一个类实现一个接口,则它必须重写接口中的abstract方法。 (3)接口回调:接口回调指把实现接口的类的对象的引用赋给该接口声明的接口变量在,那么该接口变量就可以调用被类重写的接口方法。 下列接口Com中有一个abstract方法sub(int x,int y); Com.java
ComImp.java
Application.java
输出结果:6 面向抽象编程当设计一个类时,让这个类面向抽象类或接口类,即类中的重要数据为抽象类或接口类声明的变量。 例如:已经有一个Circle类,该类创建的对象circle调用getArea()方法来计算圆的面积。
在上述Pillar类中,bottom是用具体类Circle声明的变量,如果不涉及用户需求的变化,上面Pillar类的设计没有什么不妥,但用户希望Pillar类能创建出底是三角形的柱体。上述Pillar类无法创建出这样的柱体,即上述设计的Pillar类不能应对用户这种需求。
现在Pillar类可以面向Geometry类编写代码,即Pillar类应当把Geometry对象作为自己的成员,该成员可以调用Geometry的子类重写的getArea()方法 Pillar类的设计不再依赖具体类,而是面向Geometry类,即Pillar类中的bottom是用抽象类Geometry声明的变量,而不是具体类声明的变量。
运行结果: 矩形底体积:127600.0 通过面向抽象来设计Pillar类,使得该Pillar类不再依赖具体类。,每当系统增加新的Geometry的子类时,例如增加一个Triangle子类,不需要修改Pillar类的任何代码,就可以使用Pillar创建出具有三角形底的柱体 “开-闭”原则所谓“开-闭”原则(Open-Closed?Principle),就是让用户的设计“对扩展开放,对修改关闭”。 例如,有4个类UML类图如图所示
方法复用的两种技术:类继承和对象组合子类继承父类的方法作为自己的一个方法,可以被子类中自己声明的任何实例方法调用。 父类的方法可以被子类以继承的方式复用。
组合复用一个类可以把对象作为自己的成员变量,如果用这样的类创建对象,那么该对象中就会有其他对象,该对象将其他对象作为自己的组成部分(这就是人们常说的Has-A),或者说该对象是由几个对象组合而成。
下面模拟汽车动态更换驾驶员 person.java
?Car.java
MainClass.java
继续编辑Person类子类程序,子类名字必须是Drive1,Drive2。。。。
运行结果: 没人驾驶 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 1:57:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |