Java设计模式中的设计原则之合成复用原则详解

 更新时间:2023年11月24日 10:20:41   作者:怪 咖@  
这篇文章主要介绍了Java设计模式中的设计原则之合成复用原则详解,原则是尽量使用合成/聚合的方式,而不是使用继承聚合关系表示的是整体和部分的关系,整体与部分可以分开,可以理解为成员变量和当前类的关系就是聚合关系,需要的朋友可以参考下

一、基本介绍

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

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

public class A{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->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() {
    }
}

到此这篇关于Java设计模式中的设计原则之合成复用原则详解的文章就介绍到这了,更多相关Java合成复用原则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java事务失效八大场景详细解析

    Java事务失效八大场景详细解析

    在Java开发中Spring框架提供了强大的事务管理功能,然而在实际开发过程中,由于对框架特性的误解或不当使用,可能导致事务失效问题,这篇文章主要介绍了Java事务失效八大场景的相关资料,需要的朋友可以参考下
    2025-10-10
  • Java实现XML与JSON秒级转换示例详解

    Java实现XML与JSON秒级转换示例详解

    这篇文章主要为大家介绍了Java实现XML与JSON秒级转换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 深入理解JavaWeb中过滤器与监听器的应用

    深入理解JavaWeb中过滤器与监听器的应用

    这篇文章主要介绍了JavaWeb中过滤器与监听器的应用,过滤器能够对匹配的请求到达目标之前或返回响应之后增加一些处理代码,监听器是一个接口内容由我们实现,会在特定时间被调用,感兴趣想要详细了解可以参考下文
    2023-05-05
  • Redis如何解决使用Session登录带来的共享问题

    Redis如何解决使用Session登录带来的共享问题

    文章首先介绍了Session的概念及其在实现登录功能中的应用,然后分析了Session共享问题及其原因,并提出使用Redis作为替代方案解决这一问题,接着,通过具体代码示例展示了如何基于Session和Redis实现登录功能,强调了Redis在解决Session共享问题上的优势
    2026-04-04
  • Java内部类之间的闭包和回调详解

    Java内部类之间的闭包和回调详解

    相信闭包和回调对每位学习Java的人来说都不陌生,那么今天小编和大家分享一篇关于Java内部类之间的闭包和回调,有需要的可以参考借鉴。
    2016-09-09
  • Java实现TCP通信示例代码

    Java实现TCP通信示例代码

    TCP(传输控制协议)是一种面向连接的、可靠的通信协议,这篇文章主要介绍了Java实现TCP通信的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • 浅谈JavaIO之try with底层原理

    浅谈JavaIO之try with底层原理

    众所周知,所有被打开的系统资源,比如流、文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故。本文将介绍JavaIO之try with底层原理。
    2021-06-06
  • SpringBoot@Componet注解注入失败的问题

    SpringBoot@Componet注解注入失败的问题

    这篇文章主要介绍了SpringBoot@Componet注解注入失败的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • JVM(Java Virtual Machine,Java虚拟机)的作用详解

    JVM(Java Virtual Machine,Java虚拟机)的作用详解

    JVM是Java语言实现“一次编写,到处运行”特性的基石,也是Java平台的核心组成部分,其主要作用包括平台无关性、内存管理、运行Java程序、安全性以及性能优化,通过这些功能,JVM确保了Java程序的可移植性、高效性和安全性
    2025-03-03
  • Java实现简单堆栈代码

    Java实现简单堆栈代码

    这篇文章主要为大家详细介绍了Java实现简单堆栈代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论