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合成复用原则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Scala实现冒泡排序、归并排序和快速排序的示例代码

    Scala实现冒泡排序、归并排序和快速排序的示例代码

    这篇文章主要介绍了Scala实现冒泡排序、归并排序和快速排序的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • springboot @RequiredArgsConstructor的概念与使用方式

    springboot @RequiredArgsConstructor的概念与使用方式

    这篇文章主要介绍了springboot @RequiredArgsConstructor的概念与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • java导出csv格式文件的方法

    java导出csv格式文件的方法

    这篇文章主要为大家详细介绍了java导出csv格式文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • java中用数组实现环形队列的示例代码

    java中用数组实现环形队列的示例代码

    这篇文章主要介绍了java中用数组实现环形队列的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • SpringBoot使用LomBok的示例代码

    SpringBoot使用LomBok的示例代码

    这篇文章主要介绍了SpringBoot使用LomBok的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 全面了解Java中对于异常的捕捉方法

    全面了解Java中对于异常的捕捉方法

    这篇文章主要全面介绍了Java中对于异常的捕捉方法,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • java教程之java程序编译运行图解(java程序运行)

    java教程之java程序编译运行图解(java程序运行)

    最近重新复习了一下java基础,在使用javap的过程中遇到了一些问题,这里便讲讲对于一个类文件如何编译、运行、反编译的。也让自己加深一下印象
    2014-03-03
  • 详解spring boot配置单点登录

    详解spring boot配置单点登录

    本篇文章主要介绍了详解spring boot配置单点登录,常用的安全框架有spring security和apache shiro。shiro的配置和使用相对简单,本文使用shrio对接CAS服务。
    2017-03-03
  • SpringCache常用注解及key中参数值为null问题解析

    SpringCache常用注解及key中参数值为null问题解析

    这篇文章主要介绍了SpringCache常用注解及key中参数值为null的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • spring cloud 使用oauth2 问题汇总

    spring cloud 使用oauth2 问题汇总

    这篇文章主要介绍了spring cloud 使用oauth2 问题汇总,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09

最新评论