说到java中的类与类之间存在的的关系,大多数人都会想到继承关系,也会想到组合关系,进而想到设计规则——多用组合少用继承。

但实际上,java中的关系除了这两个之外还有依赖(Dependency),关联(Association)以及聚合(Aggregation),下面简单说说我的理解

依赖(Dependency)是所有关系中最弱的,甚至你的类中甚至没有存放被调用的对象,但这种关系也是很常见的,比如说你想实现某种功能,那你只需要将这个类的对象当作参数传递进来,在你写的方法中直接调用即可。

public static class Music {
        public void play() {
            System.out.println("playing music~");
        }
    }

    public static class Me {
        public void listenToMusic(Music music) {
            music.play();
        }
    }

    public static void main(String[] args) {
        new Me().listenToMusic(new Music());
    }

这种调用是很常见的,以后再看到我们可以更专业的称之为依赖

 

关联(Association)比依赖要更强,他表示一种has-a的关系,二依赖仅仅是use-a的关系使用关联就代表声明了一种永久的委托关系,并且将要调用的对象存在类中。接下来重点讲一下关联的两种常见特例

组合(Composition)是一种关联的特殊情况,他表示的关系比关联更强,体现的是一种contains-a的关系。

举个例子,一个人有眼睛有鼻子。如果Me结束了生命周期,鼻子和眼睛的生命周期也会结束,而且,鼻子和眼睛不能脱离你单独存在。这就是比has-a更强的contains-a关系

public class Me {
        private Eye eye = new Eye();
        private Nose nose = new Nose();

        // .... 
    }

聚合(Aggregation)也是一种关联的特殊情况,他表示的关系比关联更弱,体现的是一种has-a的关系。

很多例子可以体现为聚合,学校有学生,家庭里面有孩子,这些关系就是聚合,因为即使没有这些对象,学校,家庭这样的对象仍然会存在,同时与组合之间另一个明显的差别就是,组合对象是不可以更改的,但是聚合对象是可以更改的,类的构造器往往会传递进来对应的对象,而且类内部也会提供相应的setter方法。

 

我亲眼目睹 每一个迈向死亡的生命都在热烈地生长