多用组合少用继承

2023-11-06 17:10
文章标签 组合 继承 多用

本文主要是介绍多用组合少用继承,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

面向对象编程时,有十条很重要的原则:

  • 代码复用
  • 封装变化
  • 开闭原则
  • 单一职责原则
  • 依赖注入/依赖倒置原则
  • 里氏替换原则(LSP)
  • 接口隔离原则(ISP)
  • 多用组合,少用继承
  • 面向接口编程
  • 委托原则

上图摘自《Head First - Java 设计模式》

本文列举“多用组合,少用继承”的五条原因。

1. Java 不支持多继承

Java 不支持多继承,这个限制导致只能其继承一个基类。如果想赋予一个类多个功能,选择只有两个:接口和组合。多个功能将以成员变量的形式存在于宿主类中。

2. 组合让测试更容易

单元测试的时候,我们需要 mock 数据。使用继承时,我们不得不 mock 基类。而使用组合,则简单很多。而且,我们可以通过注入不同的实例来方便的完成 mock 和线上实例的切换。

3. 现有设计模式辅证

在现有成熟的设计模式中,策略模式(Strategy design pattern)和装饰者模式(Decorator design pattern)都使用了组合的形式。

4. 继承不利于封装

在继承中,如果子类依赖父类的行为,子类将变得脆弱。因为一旦父类行为发生变化(代码结构或性能优化等原因引起的),子类也将受到影响。

5. 组合更具灵活性

使用组合,可以灵活的替换超类(基类或接口)的实现方案。比如 Java 中用于比较的接口 Comparator。以组合的形式使用 Comparator,可以通过 set 不同的实现来比较不同的实例来完成多种比较功能。

参考资料

  • 5 Reasons to Use Composition over Inheritance in Java and OOP
  • 10 Object Oriented Design Principles Java Programmer should know

这篇关于多用组合少用继承的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/357951

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

Go组合

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码 package mainimport ("fmt")type People struct{}type Pe

组合c(m,n)的计算方法

问题:求解组合数C(n,m),即从n个相同物品中取出m个的方案数,由于结果可能非常大,对结果模10007即可。       共四种方案。ps:注意使用限制。 方案1: 暴力求解,C(n,m)=n*(n-1)*...*(n-m+1)/m!,n<=15 ; int Combination(int n, int m) { const int M = 10007; int

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

INDEX+SMALL+IF+ROW函数组合使用解…

很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP、INDEX+MATCH中入门的,纵然你把全部的多条件查找方法都学会了而且运用娴熟,如VLOOKUP和&、SUMPRODUCT、LOOKUP(1,0/....,但仍然只能对这种一对多的查询望洋兴叹。   这里讲的INDEX+SMALL+IF+ROW的函数组合,

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

【内网】ICMP出网ew+pingtunnel组合建立socks5隧道

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 通过环境搭建,满足以下条件: 攻击机模拟公网vps地址,WEB边界服务器(Windows Server 2008)模拟公司对外提供Web服务的机器,该机器可以通内网,同时向公网提供服务。内网同网段存在一台Windows内网服务