首页 > 编程语言 >什么是面向对象编程领域的胖接口 - Fat Interface

什么是面向对象编程领域的胖接口 - Fat Interface

时间:2023-08-24 22:57:00浏览次数:52  
标签:实现 void 接口 Fat 面向对象编程 Interface 图形 内聚性 方法

在面向对象编程(Object-Oriented Programming,简称 OOP)领域,"胖接口",也称为"Fat Interface",是一个被广泛认识并且应当避免的设计反模式。这个术语指的是一个接口(或抽象类)包含了大量的方法,可能超出了单一职责的原则,导致接口变得臃肿、复杂和难以维护。在本文中,我将详细解释什么是胖接口,为什么它是一个问题,并通过实例来加深理解。

胖接口的定义和问题:

"胖接口"是指一个接口(或抽象类)具有过多的方法,这些方法在逻辑上可能属于不同的职责领域。这违背了面向对象设计中的单一职责原则(Single Responsibility Principle,SRP),该原则认为一个类(或接口)应该只有一个引起变化的原因。胖接口的问题在于,它使得实现该接口的类必须实现大量的方法,而其中一些方法可能与类的实际用途不相关。

胖接口的问题包括:

  1. 复杂性增加: 胖接口会导致接口本身变得复杂,难以理解和维护。实现类需要同时处理多个职责,增加了代码的复杂性和错误的风险。

  2. 低内聚性: 胖接口可能导致实现类中出现不相关的方法,降低了类的内聚性。内聚性指的是一个类应该包含相关性高的方法,胖接口违反了这一原则。

  3. 耦合增加: 实现一个胖接口的类需要实现很多方法,这可能导致不相关的类之间产生耦合。当一个类的变化需要修改多个实现类时,耦合性增加会使系统更脆弱。

  4. 难以维护: 当胖接口发生变化时,可能需要修改多个实现类的代码。这会使维护变得复杂,增加了引入错误的风险。

胖接口的示例:

考虑一个图形绘制应用的设计,其中有不同种类的图形(如矩形、圆形、三角形)和工具(如画笔、橡皮擦)。为了展示胖接口问题,我们将设计一个名为Shape的接口,用于表示不同种类的图形,并添加一些与图形绘制相关的方法。

interface Shape {
    void draw();
    void resize();
    void rotate();
    void erase();
}

在这个例子中,Shape接口包含了绘制、调整大小、旋转和擦除等方法。尽管这些方法在图形绘制领域中都是相关的,但在实际的设计中,不同种类的图形可能只需要实现其中一部分方法。

例如,对于圆形这种没有角度的图形,rotate方法毫无意义。对于橡皮擦这种工具,可能只需要erase方法,而其他方法则与其无关。在这种情况下,实现Shape接口的类不得不实现所有这些方法,即使某些方法对于特定的图形或工具是不相关的。

为了解决这个问题,我们可以考虑将Shape接口拆分为多个更细粒度的接口,每个接口代表一个具体的职责领域。例如,我们可以创建Drawable接口表示可绘制的图形,Resizable接口表示可调整大小的图形,Rotatable接口表示可旋转的图形,Eraser接口表示橡皮擦工具。

interface Drawable {
    void draw();
}

interface Resizable {
    void resize();
}

interface Rotatable {
    void rotate();
}

interface Eraser {
    void erase();
}

通过这种拆分,每个实现类只需实现其相关的接口,避免了不必要的方法实现,提高了代码的内聚性和可维护性。

总结:

"胖接口"是一个面向对象设计中应当避免的反模式,它违背了单一职责原则,导致接口变得臃肿、复杂和难以维护。在设计接口时,应该将不同职责的方法拆分为多个更细粒度的接口,以保持接口的内聚性和清晰性。通过遵循良好的面向对象设计原则,可以构建出更具灵活性、可扩展性和可维护性的软件系统。

标签:实现,void,接口,Fat,面向对象编程,Interface,图形,内聚性,方法
From: https://www.cnblogs.com/sap-jerry/p/17655405.html

相关文章

  • js面向对象编程
    基本概念面向对象编程将一个系统抽象为许多对象的集合,每一个对象代表了这个系统的特定方面。对象包括函数(方法)和数据。一个对象可以向其他部分的代码提供一个公共接口,而其他部分的代码可以通过公共接口执行该对象的特定操作,系统的其他部分不需要关心对象内部是如何完成任务的,这样......
  • 2、[FATAL] Error while cataloging RMAN Backups
    [FATAL]ErrorwhilecatalogingRMANBackups1、利用oracle小工具sysresvIPCResourcesforORACLE_SID"ifrsdev":Maximumsharedmemorysegmentsize(shmmax):4398046511104bytesTotalsystemsharedmemory(shmall):4398046511104bytesTotalsystems......
  • Python基础入门学习笔记 037 类和对象:面向对象编程
    self是什么?Python的self其实就相当于C++的this指针。由同一个类可以生产无数对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,那么python就知道需要操作哪个对象的方法了。1>>>classBall:2defsetName(self,name):3self......
  • 面向对象编程
    面向对象编程多[多种]态[状态]基本介绍方法或对象具有多种状态,是面向对象的第三大特征多态的具体体现方法的多态对象的多态/*1.一个对象的编译类型和运行类型可以不一致2.编译类型在定义对象时,就确定了,不能改变3.运行类型是可以变化的4.编译类型看定义时=号的左......
  • k8s推送代码至gitlab报错error: RPC failed; result=22, HTTP code = 413 fatal: The
    #gitpush-uoriginmainUsernamefor'http://gitlab.wjl.net':rootPasswordfor'http://[email protected]':Countingobjects:1032,done.Deltacompressionusingupto8threads.Compressingobjects:100%(871/871),done.error:R......
  • 20-面向对象编程-多态
    面向对象编程有三大特征:封装、继承和多态 访问修饰符可以控制属性的访问范围public:表示公共访问级别,可以被任何类访问。protected:表示受保护访问级别,可以被类本身、子类和同一包中的类访问。default(缺省):表示默认访问级别,即如果没有使用访问修饰符,默认是此级别,可以被同一包......
  • 随笔-调试-获取__libc_fatal退出原因
    https://github.com/lattera/glibc/blob/master/sysdeps/posix/libc_fatal.c:......
  • Cannot reduce the visibility of the inherited method from Father
    有如下两个类 Father类:publicclassFather{ publicvoidf(){System.out.println("Father.f()");}}  Son类:publicclassSonextendsFather{privatefinalvoidf(){//这里会出现编译错误Cannotreducethevisibilityoftheinheri......
  • 17-面向对象编程-继承
    面向对象编程有三大特征:封装、继承和多态 访问修饰符可以控制属性的访问范围public:表示公共访问级别,可以被任何类访问。protected:表示受保护访问级别,可以被类本身、子类和同一包中的类访问。default(缺省):表示默认访问级别,即如果没有使用访问修饰符,默认是此级别,可以被同一包......
  • 16-面向对象编程-封装
    面向对象编程有三大特征:封装、继承和多态 访问修饰符可以控制属性的访问范围public:表示公共访问级别,可以被任何类访问。protected:表示受保护访问级别,可以被类本身、子类和同一包中的类访问。default(缺省):表示默认访问级别,即如果没有使用访问修饰符,默认是此级别,可以被同一包......