• UML类图(上):类、继承和实现


    UML类图(上):类、继承和实现


    面向对象设计

    对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做。伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现。如果要自己设计,无论是给自己看,还是给别人看,势必要输出一些文档,清晰地整理出思路。

    关于文档,有些人会用文字,但是再多的文字在绝大多数人看来,都不会有一张图来得直白,本文就讲一讲使用UML图来进行面向对象的设计。

    面向对象设计主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据

    UML类图分为上下两篇,上篇是类、继承和实现三种关系,下面开始。

     

    类的UML画法

    Java是一门面向对象语言,那最基础的就类了。类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。在系统中,每个类都具有一定的职责,职责指的是类要完成什么样子的功能,要承担什么样子的义务。一个类可以有多种职责,但是设计得好的类一般只有一种职责。

    假如我现在定义了这么一个类:

    复制代码
    public class Person 
    {
    private String name = "Jack"; public String getName()
    {
    return name; } public void setName(String name)
    {
    this.name = name; } protected void playBasketball()
    { pass(); }
    private void pass()
    {
    } }
    复制代码

    那么此类对应的UML为:

    看到该图分为三层:最顶层的为类名,中间层的为属性,最底层的为方法。

    属性的表示方式为:【可见性】【属性名称】:【类型】={缺省值,可选}

    方法的表示方式为:【可见性】【方法名称】(【参数列表】):【类型】 

    可见性都是一样的,"-"表示private、"+"表示public、"#"表示protected

     

    继承关系

    继承也叫作泛化(Generalization),用于描述父子类之间的关系,父类又称为基类或者超类,子类又称作派生类。在UML中,泛化关系用带空心三角形的实线来表示。

    假如现在我又定义了一个Student和一个Teacher:

    复制代码
    public class Student extends Person 
    {
    private String studentNo; public void study()
    {
    } }
    复制代码
    复制代码
    public class Teacher extends Person 
    {
    private String teacherNo; public void teach()
    {
    } }

    复制代码

    那么,用UML表示这种关系应当是:

     

    抽象继承关系

    上面的继承是普通的继承,在Java中,除了普通的继承之外,众所周知的还有一种抽象的继承关系,因此就再讲讲抽象继承关系,作为上面的继承的补充。

    比方说我想实现一个链表(Link),插入(insert)与删除(remove)动作我想让子类去实现,链表本身只实现统计链表中元素个数的动作(count),然后有一个子类单向链表(OneWayLink)去实现父类没有实现的动作,Java代码为:

    复制代码
    public abstract class Link
    {
        public abstract void insert();
        public abstract void remove();
        
        public int count()
        {
            return 0;
        }
    }
    复制代码
    复制代码
    public class OneWayLink extends Link
    {
        public void insert()
        {
            
        }
    
        public void remove()
        {
            
        }
    }
    复制代码

    其UML的画法为:

    在UML中,抽象类无论类名还是抽象方法名,都以斜体的方式表示,因为这也是一种继承关系,所以子类与父类通过带空心三角形的实线来联系。注意:子类中覆盖了父类的abstract方法,方法名再次出现。

     

    实现关系

    很多面向对象的语言中都引入了接口的概念,如Java、C#等,在接口中通常没有属性,而且所有的操作都是抽象的,只有操作的声明没有操作的实现。UML中用与类类似的方法表示接口,假设我有一个Animal:

    public interface Animal 
    {
    public void move(); public void eat(); }

    那么它的UML应当表示为:

    很简单,注意在方法上应当有<<interface>>表示这是一个接口。接口一般没有属性,所以这里中间层没有,有属性要注意也都是常量。

    接下来,有一个Dog和一个Cat实现了Animal:

    复制代码
    public class Dog implements Animal 
    {
    public void move()
    { }
    public void eat()
    { } }
    复制代码
    复制代码
    public class Cat implements Animal 
    {
    public void move()
    { }
    public void eat()
    { } }
    复制代码

    此时应当使用带空心三角形的虚线来表示,UML应该是这样的:

    两个抽象方法,Dog和Cat的实现将不一样,当然,在Dog和Cat之中,也可以增加Dog和Cat自己的变量和方法。

     

    ================================================================================== 

    我不能保证写的每个地方都是对的,但是至少能保证不复制、不黏贴,保证每一句话、每一行代码都经过了认真的推敲、仔细的斟酌。每一篇文章的背后,希望都能看到自己对于技术、对于生活的态度。

    我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。

    其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。

    ==================================================================================

    文章内容转载自: http://www.cnblogs.com/xrq730/p/5527115.html,我做了很少的修改,这些修改都是我自己对问题的理解。




  • 相关阅读:
    ntp时间服务器
    locate 命令
    身份验证器
    centos 6 mysql源码安装
    简单上传下载命令lrzsz
    iptables记录日志
    iptables日志探秘
    du 命令
    Codeforces 1097F Alex and a TV Show (莫比乌斯反演)
    线段树教做人系列(1)HDU4967 Handling the Past
  • 原文地址:https://www.cnblogs.com/liyanwei/p/2282a6508b62d0d0dde9e9ef31220981.html
Copyright © 2020-2023  润新知