Java 中的组合

本文介绍了Java中代码复用的两种方法:组合与继承,并详细解释了组合的概念、使用方法及其实现灵活性。通过实例展示了如何在新类中创建现有类的对象以实现功能组合。

写在前面

在 Java 中,复用代码有两种方法分别是组合继承,两种方式可以减少我们写代码的工作。

  • 组合 在新类中创建现有类的对象,由于新类是由现有类的对象所组成,所以被称为组合

  • 继承 以现有类的的类型来创建新累,无需改变现有类的形式并在其中添加新的代码

而在一些场合中使用组合相较于继承将会更加的灵活

定义描述

在新类中创建现有类的对象,由于新类是由现有类的对象所组成,所以被称为组合

将现有类的对象放置到新类中。以任意其他类型的对象,任意的数量来实现不同的功能。

使用组合的时机有个简单的小技巧,可以问问自己现有的这个对象和新类的对象是什么关系

组合对象之间的关系是拥有的关系,即 has - a

比如说
汽车和轮胎,汽车拥有轮胎 可以组合

学校和教室,学校拥有教室 可以组合

医院和医生,医院拥有医生 可以组合

妻子和女朋友,妻子拥有女朋友? 不可以组合

这里用 is - a 关系来判定,即妻子是女朋友,应该使用继承

这个小技巧可以进行简单的判断,如果你是新手且犹豫不决的话,使用这个技巧是个不错的选择

设计一个复杂类,代码复用的方法需要一个人的经验和眼界的沉淀

使用方法

将现有类的对象放置到新类中。以任意其他类型的对象,任意的数量来实现不同的功能

拿上述医院拥有医生做个例子

医院拥有医生、护士

医生经常揣着一支笔(随便举个例子( ^_^ ))

这样就会明白 有 Hospital、Doctor、Nurse、Pen 类,之间的关系上面描述的也很清楚

public class Hospital {
    //医院的组成部分
    Doctor doctor = new Doctor();
    Nurse nurse = new Nurse();
    Hospital() {
        System.out.println("Hospotal Consturtor");
    }
}

class Doctor {
    //医生的组成部分
    Pen pen = new Pen();
    Doctor() {
        System.out.println("Doctor Constructor");
    }
}

class Nurse {
    Nurse() {
        System.out.println("Nurse Constructor");
    }
}

class Pen {
    Pen() {
        System.out.println("Pen Constructor");
    }
}

class Test{
    public static void main(String[] args) {
        Hospital hospital = new Hospital();
        System.out.println(hospital.doctor.pen.toString());
        System.out.println(hospital.nurse.toString());
    }
}

输出

Pen Constructor
Doctor Constructor
Nurse Constructor
Hospotal Consturtor
Pen@74a14482
Nurse@1540e19d

可以看到,我们可以使用 Hospital 对象到达代码中任意一个地方

如果为他们添加上方法

public class Hospital {
    Doctor doctor = new Doctor();
    Nurse nurse = new Nurse();
    Hospital() {
        System.out.println("Hospotal Consturtor");
    }
}

class Doctor {
    Pen pen = new Pen();
    Doctor() {
        System.out.println("Doctor Constructor");
    }

    //手术
    void operation(){
        System.out.println("operation");
    }
}

class Nurse {
    Nurse() {
        System.out.println("Nurse Constructor");
    }

    //梳理
    void nursing(){
        System.out.println("nursing");
    }
}

class Pen {
    Pen() {
        System.out.println("Pen Constructor");
    }

    void write() {
        System.out.println("Write");
    }
}

class Test{
    public static void main(String[] args) {
        Hospital hospital = new Hospital();
        hospital.doctor.pen.write();
        hospital.doctor.operation();
        hospital.nurse.nursing();
    }
}

通过上面的代码有个现象值得注意

  • 在调用导出类(子类)方法的时候会经过其基类(父类)的构造器

可以看到我们可以在将现有类的对象放置到新类中随意添加不同类型的对象和多种多样的方法
验证了其灵活性

但是,上述代码并不完美,只是单纯的使用组合,而将组合、继承和接口等互相联系起来才能尽可能地展现 Java 语言的魅力

唉,重要的话说三遍

Java 基础一定要学好
Java 基础一定要学好
Java 基础一定要学好

不然还得回头补

参考资料:Java 编程思想第 4 版

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值