Java设计模式-面向对象的几个基本原则
目录
面向抽象原则
面向抽象原则(Dependence on Abstraction Principle),也称为依赖倒置原则(Dependency Inversion Principle, DIP),是面向对象设计中的重要原则之一,属于SOLID设计原则中的一部分。它的核心思想是:高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
要点:
-
高层模块不依赖低层模块:
- 在软件系统中,高层模块通常是指那些负责业务逻辑或核心功能的部分,而低层模块是指底层的实现细节,如数据库访问、网络通信等。依赖倒置原则认为,高层模块不应该直接依赖于低层模块的实现细节。
-
两者都应该依赖抽象:
- 为了降低模块之间的耦合度,高层模块和低层模块都应该依赖于抽象(如接口或抽象类),而不是具体实现。这样一来,当底层实现发生变化时,不需要修改高层模块的代码,只需修改抽象的实现部分。
-
抽象不依赖细节,细节依赖抽象:
- 抽象通常是指接口或抽象类,它们定义了系统中的行为契约。具体实现细节应该依赖于这些抽象,而不是反过来。也就是说,设计系统时,应先定义抽象层,然后在低层实现这些抽象。
开闭原则
开闭原则(Open-Closed Principle, OCP)是面向对象设计中的一项重要原则,属于SOLID原则之一。它的核心思想是:软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。也就是说,当需求变化或需要添加新功能时,应该通过扩展现有的代码,而不是直接修改已经存在的代码。
开闭原则的关键点
-
对扩展开放(Open for extension):
- 软件系统应该允许在不修改现有代码的前提下增加新功能。这样可以让系统变得灵活、易于扩展,开发者可以通过增加新的类或功能模块来满足新的需求,而不需要更改现有的代码结构。
-
对修改关闭(Closed for modification):
- 一旦类或模块完成并投入使用,开发者应该尽量避免直接修改它。修改现有代码可能会引入新的缺陷,或影响已经稳定的功能。因此,在添加新功能或应对需求变化时,优先选择通过继承、实现接口等方式来扩展功能,而不是修改现有的代码。
开闭原则的好处
- 提高系统的稳定性:现有的功能不被修改,减少了引入新问题的风险。
- 增强代码的可维护性:因为不直接修改代码,所以不会破坏原有的逻辑和结构,维护起来更安全、可控。
- 方便扩展:通过扩展的方式可以更容易地添加新功能,增强系统的灵活性。
多用组合少用继承原则
多用组合,少用继承原则(Favor Composition Over Inheritance)是一项面向对象设计中的重要原则,它建议在设计软件时,优先使用对象组合(Composition)来复用代码,而非继承(Inheritance)。这种方法可以提供更大的灵活性,减少代码耦合,并且更容易维护和扩展系统。
原则解释
-
继承(Inheritance):
- 继承是面向对象编程中常见的机制,它允许一个类(子类)继承另一个类(父类)的属性和方法。这种方式可以让子类重用父类的功能,并通过方法重写(Override)实现一些定制功能。
- 虽然继承可以复用代码,但它也有一些缺陷,尤其是在父类和子类之间的耦合度较高时。当父类发生变化时,所有继承的子类可能都会受到影响,这增加了代码维护的复杂性。
-
组合(Composition):
- 组合是一种对象之间的关系,通过将一个对象作为另一个对象的成员属性来实现功能复用。组合的核心思想是**“有一个”(Has-a)关系,而继承表示“是一个”**(Is-a)关系。
- 在组合中,类通过包含其他类的实例来实现复杂功能,这种方式更加灵活,类的行为可以通过组合不同的对象来动态改变,而不会引入过多的依赖关系。
为什么优先使用组合
-
灵活性更高:
- 组合允许通过将不同的类组合在一起来创建新功能,而不需要创建复杂的类层次结构。对象的行为可以在运行时通过改变其组成对象的实例来调整,而继承的类结构是静态的,无法在运行时动态调整。
-
减少耦合:
- 继承会将子类和父类紧密绑定在一起,当父类发生变化时,子类可能需要进行相应的修改。而组合则不会有这种强依赖关系,每个类可以独立于其他类进行维护。
-
符合单一职责原则:
- 继承往往会导致子类继承父类的所有功能,即使有些功能子类并不需要使用。而组合可以更加精准地选择哪些功能应该组合到一起,保持类的单一职责,从而提高系统的可维护性。
-
避免“菱形继承”问题:
- 在复杂的继承体系中,可能会出现“菱形继承”问题(即多个父类继承同一个基类),这会导致方法冲突等问题。而组合可以有效避免这种复杂的继承结构。
高内聚低耦合原则
高内聚低耦合原则(High Cohesion and Low Coupling)是面向对象设计和软件架构中的一项关键原则,旨在提高系统的模块化、可维护性和可扩展性。它包括两个方面:高内聚和低耦合,这两者是设计健壮、灵活和易于维护的系统的基础。
1. 高内聚(High Cohesion)
内聚指的是一个模块或类内部各个元素之间的紧密程度。高内聚意味着一个模块、类或方法的职责是单一且明确的,内部功能高度相关。
-
高内聚的特点:
- 模块内的元素(如方法、属性)有紧密的关联性,共同为实现某个单一的功能服务。
- 模块的职责明确,遵循单一职责原则(Single Responsibility Principle, SRP)。
- 功能划分清晰,每个模块或类处理特定的逻辑,便于理解和维护。
-
高内聚的好处:
- 易维护:当模块内部功能相关时,维护该模块会变得容易,因为功能集中在一起,修改一个功能不会影响其他不相关的部分。
- 易理解:高内聚的模块通常职责单一,理解起来更加简单。
- 减少依赖:高内聚的模块对外部的依赖较少,通常独立处理自己的逻辑。
2. 低耦合(Low Coupling)
耦合指的是一个模块与其他模块之间的依赖程度。低耦合意味着模块之间的依赖性低,一个模块的变化不会对其他模块产生过多影响。
-
低耦合的特点:
- 模块之间相互独立,减少直接的依赖关系。
- 模块之间通过抽象接口、消息或依赖注入等方式进行通信,而不是直接依赖具体的实现。
- 模块之间的交互是明确且尽量少的,避免不必要的依赖链条。
-
低耦合的好处:
- 易扩展:低耦合的模块可以很容易地独立扩展或修改,而不会影响其他模块。
- 易维护:当一个模块变化时,其他模块的代码无需修改,减少了维护成本。
- 提高复用性:低耦合的模块更具通用性,能够在不同的系统或场景中复用。
高内聚与低耦合的关系
- 协同作用:高内聚和低耦合相辅相成。高内聚强调模块内部的紧密性,而低耦合强调模块之间的独立性。一个模块内的元素应该紧密相关(高内聚),但模块之间的依赖应尽可能降低(低耦合)。
- 模块化设计:高内聚和低耦合共同推动模块化设计,通过划分单一功能的模块,使得系统更容易维护、扩展和复用。
更多推荐

所有评论(0)