组合

2023-11-05

定义类,就是新建了一种类型(type)。有了类,我们接着构造相应类型的对象。更进一步,每个类型还应该有一个清晰的接口(interface),供用户使用。我们可以在一个新类的定义中使用其他对象。这就是组合(composition)。组合是在Java中实现程序复用(reusibility)的基本手段之一。
组合是继承的另外一种形式,组合大于继承。

//一般情况继承
class A extends B{


}
//组合
class A{
    public B b;
}

组合优先、继承其次。具体依赖抽象,无论高层、底层。职责单一、依赖单纯、高内聚、低耦合。

OOP七大原则

OCP(Open-Closed Principle),开放封闭原则:软件实体应该扩展开放、修改封闭。
实现:合理划分构件,一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里;一种可变性不应当与另一个可变性混合在一起。
DIP(Dependency Inversion Principle),依赖倒置原则:摆脱面向过程编程思想中高层模块依赖于低层实现,抽象依赖于具体细节。OOP中要做到的是,高层模块不依赖于低层模块实现,二者都依赖于抽象;抽象不依赖于具体实现细节,细节依赖于抽象。
实现:应该通过抽象耦合的方式,使具体类最大可能的仅与其抽象类(接口)发生耦合;程序在需要引用一个对象时,应当尽可能的使用抽象类型作为变量的静态类型,这就是针对接口编程的含义。
LSP(Liskov Substitution Principle),Liskov替换原则:继承思想的基础, 即子类能替代父类使用。“只有当衍生类可以替换掉基类,软件单位的功能不会受到影响时,基类才真正被复用,而衍生类也才能够在基类的基础上增加新的行为。”
ISP(Interface Insolation Principle),接口隔离原则:客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上,不要引入无关因素,避免接口污染。
实现:一个类对另外一个类的依赖性应当是建立在最小的接口上的。使用多个专门的接口比使用单一的总接口要好。
SRP(Single Resposibility Principle),单一职责原则:就一个类而言,接口职责单一,应该仅有一个引起它变化的原因。 如果一个类的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会抑止这个类完成其他职责的能力。
CARP(Composite/Aggregate Reuse Principle),合成/聚合复用原则:设计模式告诉我们对象委托优于类继承,从UML的角度讲,就是关联关系优于继承关系。尽量使用合成/聚合、尽量不使用继承。
实现:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,以整合其功能。
LoD(Law Of Demeter or Principle of Least Knowledge),迪米特原则或最少知识原则:就是说一个对象应当对其他对象尽可能少的了解,依赖越少越好。即只直接与朋友通信,或者通过朋友与陌生人通信。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

组合 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • Tomcat启动乱码问题解决

    Tomcat 控制台UTF 8乱码问题 1 修改cmd的编码格式 快捷键win R打开运行程序 输入regedit打开注册表 找到以下路劲并且修改 HKEY LOCAL MACHINE SOFTWARE Microsoft Command
  • list怎么删除元素和ConcurrentModificationException

    当面试官 怎么删除list里面的元素 我 用for循环 活着迭代器 举例 循环 迭代器 看出什么问题了吗 对同一个集合遍历的不能删除 怎么解决 1 拷贝一份 一个用来遍历 一个用来删除 2 不用list的remove方法 用迭代器的remo
  • 【马士兵】Python基础--12

    Python基础 12 文章目录 Python基础 12 字符串比较 字符串切片 格式化字符串 字符串的编码与解码 知识点总结 字符串比较 print apple gt app print aanan gt banan print ord
  • RabbitMQ消息队列的总结

    什么是消息队列 MQ全称为MessageQueue 消息队列 MQ 是一种应用程序对应用程序的通信方法 应用程序通过写和检索出入列队的针对应用程序的数据 消息 来通信 而无需专用连接来链接它们 消息传递指的是程序之间通过在消息中发送数据进行
  • Java 高级篇:JVM 垃圾回收机制

    Java 语言的一大优势在于其具有自动垃圾回收 Garbage Collection GC 机制 让开发者无需关心内存的分配与释放 本文将详细解析 JVM Java Virtual Machine 中的垃圾回收机制 带你深入了解 GC 如何
  • 深度学习和语音系列教程 5-100:求共振峰

    文章目录 1 基音频率 1 1 基音频率的查看 2 共振峰的获取 2 1 倒谱法求共振峰 2 2 测试结果 2 3 共振峰位置坐标 2 4 多种情况下的共振峰测试 1 基音频率 1 1 基音频率的查看 基音频率就是发浊音时 气流通过声门使声
  • 在此计算机上运行应用程序不可选,win10提示此应用无法在你的电脑上运行若要找到适用怎么解决...

    最近有朋友问小编win10提示此应用无法在你的电脑上运行若要找到适用于你的电脑的版本 请咨询软件发布者应该怎么办 对于这样的问题 相信很多朋友都遇到过了 有时候我们经常会遇到这种情况 例如在win10系统中打开excel就可能会遇到这个错误
  • windows10清理鼠标右键菜单

    windows10清理鼠标右键菜单 文章目录 windows10清理鼠标右键菜单 前言 一 右键菜单管理 二 使用步骤 1 打开软件 2 选择不显示的菜单 效果 前言 系统右键菜单过长 挺烦人的 一般网上给出的答案都是修改注册表 对于小白来
  • 互联网世界的 “人工智能”——探秘 “深度学习” 的前世今生

    编者按 本文来自 流浪汉 投稿 ZhangLumin 一个在硅谷工作的码农 有机器学习背景 平常对产品方面很有兴趣 最近一段时间里 Facebook Google Yahoo 百度等各大公司都在尝试将深度学习 deep learning 算
  • 位图--排序

    位图使用基本情况 一个字节有8位 假设第0位表示0 第1位表示1 那么一个字节就可以表示8个数字 整数序列 0 1 4 7 在位序列中表示为10010011 左边第一位为低位 表示有效数字0 位序列如何表示 Java 整形int 用4个字节
  • java中重写父类方法加不加@Override

    java中重写父类方法加不加 Override 这个是我在刚学习java时遇到的问题 希望能给像我一样的新手学习时带来帮助 如有错误请指正 谢谢 class Father public String name public int age
  • python print带颜色乱码无效

    乱码了 那么导入库 并且进行init 即可 import colorama colorama init autoreset True print 033 1 31 40m 测试 print 033 1 32 41m 测试 print 033
  • “模块计算机类型“x64”与目标计算机类型“X86”冲突解决方案

    最近在编译一款开源软件的时候 遇到了 模块计算机类型 x64 与目标计算机类型 X86 冲突的问题 网上查了好多资料 都是配置 链接器 高级 目标计算机 和选择X64平台编译器 可是怎么试都不行 最后发现是 命令行 里依然是 X86 的问题
  • Java多线程面试题及答案

    这篇文章主要是对多线程的问题进行总结的 因此罗列了40个多线程的问题 这些多线程的问题 有些来源于各大网站 有些来源于自己的思考 可能有些问题网上有 可能有些问题对应的答案也有 也可能有些各位网友也都看过 但是本文写作的重心就是所有的问题都
  • 向量正交 与 函数正交

    目录 1 向量内积和外积 1 1 向量内积 点乘 1 2 向量外积 差乘 2 向量的正交 3 函数的正交 4 函数正交的意义 1 向量内积和外积 1 1 向量内积 点乘 假设 a a1 a2 an b b1 b2 bn 则a与b的内积为 a
  • Android开发之多Fragment切换优化(解决切换卡顿)

    我想刚刚接触安卓的同学或许会这么写 FragmentManager fragmentManager getSupportFragmentManager FragmentTransaction fragmentTransaction frag
  • Vue input输入框回车以后自动刷新页面

    今天测试提了一个bug 输入框输入barCode时 按下回车键应该是录入数量 但是却直接刷新页面了 一起来探究一下为什么 原因 W3C 标准中有如下规定 当一个form元素中只有一个输入框时 在该输入框中按下回车应提交该表单 解决方案 可以
  • 老男孩blog博文内容列表整理(博文索引)

    我花了点时间整理了下博文列表 如果有对大家有用的 我花了点时间整理了下博文列表 如果有对大家有用的 请直接拿下 请不要只当知识收藏家 如果喜欢收藏 我建议收藏古董 100 原创 生产环境多年经验总结 无任何测试不靠谱的博文 44 生产场景不
  • 职场恶霸00后,看完这篇你就知道了

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 组合

    定义类 就是新建了一种类型 type 有了类 我们接着构造相应类型的对象 更进一步 每个类型还应该有一个清晰的接口 interface 供用户使用 我们可以在一个新类的定义中使用其他对象 这就是组合 composition 组合是在Java