Java设计原则——合成复用原则

我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习。
学习从来无捷径,循序渐进登高峰。

在这里插入图片描述


部分笔记来源于尚硅谷设计模式视频教学。

一、基本介绍

原则是尽量使用合成/聚合的方式,而不是使用继承

聚合关系(Aggregation)表示的是整体和部分的关系,整体与部分可以分开
可以理解为成员变量和当前类的关系就是聚合关系。

public class A{
	private B b;
}

组合关系:也是整体与部分的关系,但是整体与部分不可以分开。也就是假如我创建A类,A类当中有个成员变量是B,而B也会随着A的创建进行实例化,这种叫组合关系。

public class A{
	private B b = new B();
}

如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。

时刻记住一句话:针对接口编程,而不是针对实现编程

合成复用原则的重要性:

  1. 通常类的复用分为继承复用合成复用两种,继承复用虽然有简单易实现的优点,但它也存在以下缺点。继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用
  2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
  3. 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。

采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。

  1. 维持了类的封装性。因为成分对象的内部细节新对象看不见的,所以这种复用又称为“黑箱”复用
  2. 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口
  3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。

二、应用实例

1、示例一

发现问题 :假如我有一个类为C,他和D类有同样的方法update,Test2类难道也要继承C吗?

public class Test2 extends D {
    public void add() {
        update();
    }
}

class D {
    public void update() {

    }
}

2、示例二

去除继承关系,抽出来一个接口A,将A接口和Test1作为聚合关系,有必要的话也可以改为组合关系。这样一来代码耦合度就降低了,同时代码也变得不是那么死板了。

public class Test1 {
    private A a;

    public void add() {
        a = new B();
        a.update();
    }
}

interface A {
    void update();
}

class B implements A {

    @Override
    public void update() {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值