一些面向对象的设计法则(1)

实战指南:从零开始用YOLOv8训练VisDrone无人机检测模型 本文提供了一份详细的实战指南,手把手教你从零开始使用YOLOv8训练一个无人机检测模型。内容涵盖VisDrone数据集下载与格式转换、YAML配置文件编写、模型训练与评估,以及最终的推理部署,旨在帮助开发者快速掌握无人机视角下的目标检测技术。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

法则1:优先使用(对象)组合,而非(类)继承
[ Favor Composition Over Inheritance ]

  • 组合

    1.(对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。
    2.将功能委托给所组合的一个对象,从而获得新功能。
    3.有些时候也称之为"聚合"(aggregation)或"包容"(containment),尽管有些作者对这些术语赋予了专门的含义
    4.例如:
    a.聚合:一个对象拥有另一个对象或对另一个对象负责(即一个对象包含另一个对象或是另一个对象的一部分),并且聚合对象和其所有者具有相同的生命周期。(译者注:即所谓的"同生共死"关系,可参见GOF的Design Patterns: Elements of Reusable Object-Oriented Software的引言部分。)
    b.包容:一种特殊类型的组合,对于其它对象而言,容器中的被包含对象是不可见的,其它对象仅能通过容器对象来访问被包含对象。(Coad)

  • 5.包含可以通过以下两种方式实现:
    a.根据引用(By reference)
    b.根据值(By value)
    6.C++允许根据值或引用来实现包含。
    7.但是在Java中,一切皆为对象的引用!

  • 组合的优点和缺点

  • 1.优点:
    a.容器类仅能通过被包含对象的接口来对其进行访问。
    b."黑盒"复用,因为被包含对象的内部细节对外是不可见。
    c.对装性好。
    d.实现上的相互依赖性比较小。(译者注:被包含对象与容器对象之间的依赖关系比较少)
    e.每一个类只专注于一项任务。
    f.通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。

    2.缺点:
    a.从而导致系统中的对象过多。
    b为了能将多个不同的对象作为组合块(composition block)来使用,必须仔细地对接口进行定义。

  • 继承


    1.(类)继承是一种通过扩展一个已有对象的实现,从而获得新功能的复用方法。
    2.泛化类(超类)可以显式地捕获那些公共的属性和方法。
    3.特殊类(子类)则通过附加属性和方法来进行实现的扩展。

  • 继承的优点和缺点


    1.优点:
    a.容易进行新的实现,因为其大多数可继承而来。
    b.易于修改或扩展那些被复用的实现。
    2.缺点:
    a.破坏了封装性,因为这会将父类的实现细节暴露给子类。
    b. "白盒"复用,因为父类的内部细节对于子类而言通常是可见的。
    c.当父类的实现更改时,子类也不得不会随之更改。
    d.从父类继承来的实现将不能在运行期间进行改变。

  • Coad规则


    仅当下列的所有标准被满足时,方可使用继承:
    a.子类表达了"是一个…的特殊类型",而非"是一个由…所扮演的角色"。
    b子类的一个实例永远不需要转化(transmute)为其它类的一个对象。
    c.子类是对其父类的职责(responsibility)进行扩展,而非重写或废除(nullify)。
    d.子类没有对那些仅作为一个工具类(utility class)的功能进行扩展。
    e.对于一个位于实际的问题域(Problem Domain)的类而言,其子类特指一种角色(role),交易(transaction)或设备(device)。

  • 继承/组合示例1

1."是一个…的特殊类型",而非"是一个由…所扮演的角色"
失败。乘客是人所扮演的一种角色。代理人亦然。
2.永远不需要转化
失败。随着时间的发展,一个Person的子类实例可能会从Passenger转变成Agent,再到Agent Passenger。
3.扩展,而非重写和废除
通过。
4.不要扩展一个工具类
通过。
5.在问题域内,特指一种角色,交易或设备
失败。Person不是一种角色,交易或设备。


继承并非适用于此处!

使用组合进行挽救!

  • 继承/组合示例2

1."是一个…的特殊类型",而非"是一个由…所扮演的角色"
通过。乘客和代理人都是特殊类型的人所扮演的角色。
2.永远不需要转化
通过。一个Passenger对象将保持不变;Agent对象亦然。
3.扩展,而非重写和废除
通过。
4.不要扩展一个工具类
通过。
5.在问题域内,特指一种角色,交易或设备
通过。PersonRole是一种类型的角色。

继承适用于此处!

  • 继承/组合示例3

1."是一个…的特殊类型",而非"是一个由…所扮演的角色"
通过。预订和购买都是一种特殊类型的交易。
2.永远不需要转化
通过。一个Reservation对象将保持不变;Purchase对象亦然。
3.扩展,而非重写和废除
通过。
4.不要扩展一个工具类
通过。
5.在问题域内,特指一种角色,交易或设备
通过。是一种交易。

继承适用于此处!

  • 继承/组合示例4

1."是一个…的特殊类型",而非"是一个由…所扮演的角色"
失败。预订不是一种特殊类型的observable。
2.永远不需要转化
通过。一个Reservation对象将保持不变。
3.扩展,而非重写和废除
通过。
4.不要扩展一个工具类
失败。Observable就是一个工具类。
5.在问题域内,特指一种角色,交易或设备
不适用。Observable是一个工具类,并非一个问题域的类。。

继承并非适用于此处!

  • 继承/组合总结


    1.组合与继承都是重要的重用方法
    2.在OO开发的早期,继承被过度地使用
    3.随着时间的发展,我们发现优先使用组合可以获得重用性与简单性更佳的设计
    4.当然可以通过继承,以扩充(enlarge)可用的组合类集(the set of composable classes)。
    5.因此组合与继承可以一起工作
    6.但是我们的基本法则是:
    优先使用对象组合,而非(类)继承
    [ Favor Composition Over Inheritance ]

一些面向对象的设计法则:(Bob Tarr 著,outmyth 译)

法则1:优先使用(对象)组合,而非(类)继承
法则2:针对接口编程,而非(接口的)实现
法则3:开放-封闭法则(OCP)
法则4:Liskov替换法则(LSP)

华为OD机试真题2026双机位C卷 Java&Go 实现【用户入网定期复评】 用户开立支付账户,在开户完成后立即对用户进行一次风险模型评级,输出一个评分风险,评分范围1-100,等区间的分为5个等级,1-19为等级1,20-39为等级2,40-59为等级3,60-79为等级4,80-100为等级5,系统每天会任务对全量入网用户进行计算复评时间,输出评分给出新的风险等级。复评规则如下: 阅读详情

相关推荐

IEDA激活码失效?教你5分钟快速续期的方法

本文针对IEDA激活码失效问题,提供了一套从快速应急到深度排查的完整解决方案。文章不仅详解了5分钟快速续期与清理缓存等应急方法,更深入剖析了授权机制、离线激活流程,并指导如何构建可持续的授权管理策略,帮助开发者彻底解决激活困扰,确保开发环境稳定。

a0b1c2d3的专栏 274

java 合成 继承,关于Java:偏好合成与继承

本问题已经有最佳答案,请猛点这里访问。Favor composition over inheritance是非常流行的短语。我读了几篇文章,最后每篇文章都说use inheritance when there is pure IS-A relationship between classes.本文的一个示例:苹果和水果之间存在着明显的"是"关系,即苹果是一种水果,但作者也将其表示为"苹果有"——一...

weixin_36440198的博客 178

python 写一个简单的 telegram bot (电报机器人)

replit.com 环境配置太恶心了,只能使用 poetry.poetry 这个名字是挺好听,用起来也是很垃圾,太恶心。heroku.com 注册登录不方便,需要各种验证。所以,部署的问题,目前搁置。

waterHBO的博客 3198

为什么更推荐使用组合而非继承关系?

最近在看公司项目的代码,看到了大量的继承体系,而且还是继承了多层,维护、阅读都十分的困难。在查阅了一些资料以后,包括《Effective Java》一书中的第16条提到“组合优先于继承”。那继承到底会暴露什么问题呢?为什么更推荐优先使用组合呢?欢迎关注微信公众号「JAVA旭阳」交流和学习不知道大家项目中继承用的多吗?其实在JDK中就有许多违反这条原则的地方,比如栈Stack类并不是Vector,不应该有继承关系,但是实际上就是继承自Vector。

程序员旭阳的专栏 684

SAP Script表单开发中ABAP preform方法的实战应用与调试技巧

本文深入探讨了在SAP Script表单开发中调用ABAP程序(preform方法)的实战应用与调试技巧。通过一个获取供应商版本名称的实例,详细讲解了如何在SE71中嵌入PERFORM指令、编写ABAP子程序进行数据查询与处理,并重点介绍了使用SAP Script Debugger进行高效调试的方法,帮助开发者灵活扩展表单功能,实现复杂业务逻辑。

o0p1q2r3的博客 554

Java - 组合和继承

Java是一个面向对象的语言。每一个学习过Java的人都知道,封装、继承、多态是面向对象的三个特征。每个人在刚刚学习继承的时候都会或多或少的有这样一个印象:继承可以帮助我实现类的复用。所以,很多开发人员在需要复用一些代码的时候会很自然的使用类的继承的方式,因为书上就是这么写的(老师就是这么教的)。但是,其实这样做是不对的。长期大量的使用继承会给代码带来很高的维护成本。本文将介绍组合和继承的概念及区别

南墙不破头不回 923

CentOS7无网环境实战:MySQL8.0完整离线安装与避坑指南(附依赖包下载)

本文详细介绍了在CentOS7无网环境下MySQL8.0的完整离线安装流程,包括依赖包获取、系统预处理、MySQL二进制安装、服务配置与优化等关键步骤。特别针对离线安装的特殊需求,提供了从依赖包下载到服务调优的全链路解决方案,帮助用户在企业内网或隔离环境中高效部署MySQL数据库。

bush的博客 176

面向对象的设计法则1[Favor Composition Over Inheritance]

法则1:优先使用(对象)组合,而非(类)继承[ Favor Composition Over Inheritance ]组合1.(对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。2.将功能委托给所组合的一个对象,从而获得新功能。3.有些时候也称之为"聚

woxiaozhi的专栏 3014

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3661

vue2/3 - 详细实现高德地图轨迹回放,vue高德地图车辆历史行驶轨迹播放,在地图上绘制行程轨迹|起点和终端的路程绘制|用户运动轨迹绘制及播放等(支持开始/暂停、进度条拖放、控制播放轨迹的倍速等)

vue2,vue3,nuxt,高德地图,轨迹,vue高德地图轨迹回放,历史轨迹回放,轨迹回放功能支持倍速及进度条拖拽,VUE高德地图轨迹回放、倍速调整、进度条拖拽,vue3高德地图轨迹回放,Vue实现地图路径回放,vue中使用高德地图实现历史轨迹回放并能控制播放轨迹的倍速,多条轨迹陆续播放,巡航轨迹做带进度条和倍速的轨迹回放,Vue高德地图路径回放,历史轨迹回放并能控制播放轨迹的倍速,使用高德地图实现轨迹播放和进度条控制,vue高德地图如何实现轨迹回放,高德地图做轨迹绘制用什么api,高德轨迹API,驾车轨

✅ 精选推荐文章 1万+

设计模式-1. SOLID法则以及其他面向对象的设计原则

一、概述 头文字 缩写 英文全称 中文全称 解释 S SRP Single responsibility principle 单一职责法则 一个类应该只有单一职责,也就是说,只允许有一个软件定义的改变影响到类 O OCP Open/close Principle 开/闭原则 软件实体应该对扩展开放,对修改关闭 L LSP Lisk

qiutongyeluo的专栏 592

PyTorch深度学习实战(41)——循环神经网络与长短期记忆网络

循环神经网络 (Recurrent Neural Network, RNN) 通过将前一个时间步的隐藏状态作为当前时间步的输入,实现对序列数据的建模,由于循环连接的存在,RNN 能够捕获时间依赖关系,然而,RNN 在处理长期依赖性问题时会遇到困难。为了解决这个问题,提出了 LSTM,通过引入门控机制改进 RNN 来有效地处理长期依赖关系。在本节中,了解了 LSTM 和 RNN 的基本原理,并介绍了如何在 PyTorch 中实现 LSTM。

盼小辉丶的博客 1万+

一些面向对象的设计法则-法则1:优先使用(对象)组合,而非(类)继承

法则1:优先使用(对象)组合,而非(类)继承[ Favor Composition Over Inheritance ]组合n         (对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。n         将功能委托给所组合的一个对象,从而获得新功能。n         有些时候也称之为“聚合”(aggregation)或“包容”(conta

『 李天平的博客 』 1904

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

一些面向对象的设计法则

一些面向对象的设计法则 Bob Tarr 著            outmyth 译     法则1:优先使用(对象)组合,而非(类)继承组合n         (对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。n         将功能委托给所组合的一个对象,从而获得新功能。n         有些时候也称之为“聚合”(aggre

ewolf的工作专栏 1059

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

面向对象的设计法则(1)——优先使用(对象)组合,而非(类)继承

[ Favor Composition Over Inheritance ]  组合  1.(对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。  2.将功能委托给所组合的一个对象,从而获得新功能。  3.有些时候也称之为"聚合"(aggregation)或"包容"(containment),尽管有些作者对这些术语赋予了专门的含义  4.例如:  a.聚合:一个对象拥有另

茶爸爸(微信:benyzhous) 的专栏 894

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

面向对象设计/编程的四大法则

一些面向对象的设计法则 Bob Tarr 著outmyth 译         法则1:优先使用(对象)组合,而非(类)继承[ Favor Composition Over Inheritance ]组合n         (对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。n         将功能委托给所组合的一个对象,从而获得新功能。n         有些时候也称

T.johnny的专栏 922

[阅读笔记]面向对象的设计法则--法则1:优先使用(对象)组合,而非(类)继承 Favor Composition Over Inheritance

组合      组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。      将功能委托给所组合的一个对象,从而获得新功能。      实现方式   根据引用(By reference)   根据值(By value)      优点   容器类仅能通过被包含对象的接口来对其进行访问。   “黑盒”复用,因为被包含对象的内部细节对外是不可见。   封装性好。   实现上的相互依

莫问前程 只管努力 1731

面向对象的设计法则(1)——优先使用(对象)组合,而非(类)继承(转)...

[ Favor Composition Over Inheritance ] 组合 1.(对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。 2.将功能委托给所组合的一个对象,从而获得新功能。 3.有些时候也称之为"聚合"(aggregation)或"包容"(containment),尽管有些作者对这些术语赋予了专门的含义 4.例如: ...

weixin_34318956的博客 106

Github标星1.6W+,程序员不得不知的“潜规则”又火了,早知道就不会秃头了

大家好,我是你们的 前端章鱼猫,一个不喜欢前端、又不喜欢吃鱼的超级猫 ~当程序员谈论开发设计时,常常会聊到非常多的定律,而 GitHub 上的一个名为「hacker-laws」的仓库收录了...

前端GitHub 347

软考高级系统架构设计师(七) 需求工程相关

需求工程 需求定义 需求验证 需求跟踪 需求变更管理 软件系统建模 结构化设计 面向对象设计 软件界面设计

我的E家 860

C# & Unity 面向对象补全计划 七大原则 之 迪米特法则(Law Of Demeter )难度:☆☆☆ 总结:直取蜀汉

迪米特

咩咩的博客 570
上一篇: Java 高层网络编程
下一篇: 请大家评论!
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值