美文网首页
面向对象设计中类的关系

面向对象设计中类的关系

作者: 進无尽 | 来源:发表于2018-04-09 16:03 被阅读0次

    所谓的设计正是采用恰当的方式组织类关。因此谈设计我认为首先要从类之间的关系开始说起.

    在java开发中,有很多时候我们是在不断的处理类与类之间关系,其中这六种关系是:
    依赖、关联、聚合、组合、继承、实现,他们的耦合度依次增强,
    其在UML的表示如下:

    1.依赖(Dependence)

    比如在实际生活中我们做一件事情都需要借助其他物体的帮助,换句话说,
    我们依赖于其他的物体生活。比如:人要开车。依赖也是最普遍和常见的关系。
    

    在代码层次上,依赖关系多表现为函数的参数.

    public class Person{
        public void drive(Car car){
            //
        }
    }
    
    

    2.关联 (Association)

    如果说依赖关系讲求的临时性,偶然性的话,那么关联关系则是一种持久性的关系。
    与依赖关系不同,关联对象的双方地位同级,存在长期,固定的对应关系,即关联是一种强依赖。
    
    关联关系共分为两种:单向关联和双向关联。
    
    所谓单向关联通俗点讲就是“你中有我,但我中未必有你”,比如小明拥有一辆车(注意和小明开车进行区分),但车这个对象可不拥有你。
    和单向关联相对应的是双向关联,也即是”你中有我,我中有你”,比如夫妻就是一种双向关联.
    

    在代码层次上,关联关系表现为对象作为另一个类的成员变量.

    单向关联

    public class Person{
        private Car car;
        public void setCar(Car car){
            this.car=car;
        }
    }
    

    双向关联

    public class Husband{
        private Wife wife=new Wife();
    
        public void say(){
            System.out.println("my wife name:"+wife.getName());
        }
    }
    
    public class Wife{
        private Husband husband=new Husband();
    
        public void say(){
            System.out.println("my husband name:"+husband.getName());
        }
    }
    

    3.聚合(Aggregation)

    聚合关系是一种强关联关系,两者之间最主要的区别是在语意上:聚合之间的关系更像是”整体-部分”,有点组装的含义,
    
    而关联关系的对象间是相互独立的,不存在组装关系. 
    
    比如:在现实世界中,分子是由原子组成的,汽车是由各种零部件组成的等,这都是聚合关系的最好说明.
    这里要注意,组成A类型分子的原子也可以组成B类型的分子,这说明什么呢?
    也就是部分可以单独存在,换句话说就是整体和部分两者的生命周期不是同步的.
    比如:水分子是由氧原子和氢原子组成的,你不能说没有水分子就没有氧原子和氢原子吧.
    

    在代码层次上,聚合和关联两者的形式一致,都表现为成员变量.

    public class Car{
        private Tyre tyre;
        private Engine engine;
    
        public void setTyre(Tyre tyre){
            this.tyre=tyre;
        }
    
        public void setEngine(Engine engine){
            this.engine=engine;
        }
    }
    
    image.png

    4.组合(Composition)

    组合和聚合非常类似,都表示的”整体-部分”,“整体”负责“部分”的生命周期,他们之间是共生共死的;
    并且“部分”单独存在时没有任何意义。
    不难发现,组合是一种强聚合关系.比如,人这个生命体由不同器官构成,其中我们拿心脏来说一下,
    人要活着必须依靠心脏,心脏不能脱离人这个生命体,两者一旦分开,都会死亡. 
    

    在代码层次上,通常表现为类的成员变量,除此之外还要求这个成员变量在构造函数中创建.

    public class People{
        private Heart heart;
    
        public People(){
            heart=new Heart();
        }
    }
    
    image.png

    5.继承(Generalization)

    继承表示类与类(或者接口与接口)之间的父子关系。在java中,用关键字extends表示继承关系。
    

    6.实现(Implementation)

     表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示。
    

    相关文章

      网友评论

          本文标题:面向对象设计中类的关系

          本文链接:https://www.haomeiwen.com/subject/wnsihftx.html