1. 单一职责原则(Single Responsibility Principle, SRP)
定义:一个类应该只有一个引起变化的原因,即该类应该只负责一项职责。
解释:
-
职责指的是类的功能或任务。一个类承担的职责越多,它需要变化的可能性就越大。
-
如果一个类有多个职责,它的修改可能会因为不同的原因而变得复杂和难以维护。
应用:将不同的职责分离到不同的类中,提高代码的可读性和可维护性。例如,数据处理和用户界面的逻辑应分别放在不同的类中。
应用的设计模式:
-
策略模式(Strategy Pattern):策略模式将算法封装在独立的策略类中,使得每个策略类只负责一个特定的算法,从而使算法的修改不会影响其他部分。
-
装饰者模式(Decorator Pattern):装饰者模式将功能的扩展分离到多个装饰器类中,使得每个装饰器类只负责一个特定的功能扩展。
2. 开放/关闭原则(Open/Closed Principle, OCP)
定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
解释:
-
软件系统应该允许在不修改现有代码的情况下,通过扩展来增加新功能。
-
通过继承和接口的使用,现有代码可以依赖于抽象接口,而不是具体实现,从而避免修改现有的稳定代码。
应用:设计模式如策略模式和装饰者模式遵循这个原则,通过实现接口或继承抽象类来扩展功能,而不改变已有代码。
应用的设计模式:
-
策略模式(Strategy Pattern):允许在不修改现有代码的情况下,通过添加新的策略类来扩展算法的功能。
-
观察者模式(Observer Pattern):允许在不修改现有主题类的情况下,通过添加新的观察者类来扩展对事件的响应。
3. 里氏替换原则(Liskov Substitution Principle, LSP)
定义:如果 S 是 T 的一个子类型,那么类型为 T 的对象可以用类型为 S 的对象替换,而不会改变程序的正确性。
解释:
-
子类必须能够替换父类而不影响程序的正确性,即子类应当扩展父类的功能,而不是减弱或改变它。
-
保证子类对象能够完美适配于父类对象的场景中。
应用:确保继承关系的正确性。例如,重载或重写的方法应保持父类方法的预期行为,避免违反 LSP 原则。
应用的设计模式:
-
模板方法模式(Template Method Pattern):模板方法模式允许子类替换父类中的部分实现,但必须保持算法的整体结构和预期行为不变。
-
工厂方法模式(Factory Method Pattern):工厂方法模式中的工厂可以用子类工厂替换父类工厂,生成的产品对象也应该能够替换父类产品而不影响程序的正确性。
4. 依赖倒置原则(Dependency Inversion Principle, DIP)
定义:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
解释:
-
系统应通过接口或抽象类来定义模块之间的依赖关系,而不是具体的实现类。
-
这减少了高层模块对低层模块实现的依赖,从而提高系统的灵活性和可维护性。
应用:使用接口和抽象类定义模块间的交互。依赖注入(Dependency Injection)是实现 DIP 的常用技术。
应用的设计模式:
-
依赖注入模式(Dependency Injection Pattern):通过注入依赖来使高层模块依赖于抽象而非具体实现,从而符合依赖倒置原则。
-
桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使得它们可以独立变化,从而实现高层模块对抽象的依赖,低层模块对具体实现的依赖。
5. 接口隔离原则(Interface Segregation Principle, ISP)
定义:不应该强迫客户端依赖它们不使用的接口。接口应尽量小而专一。
解释:
-
应该为客户端提供专门的接口,而不是提供一个大的臃肿的接口。
-
这样做减少了实现类的负担,提高了系统的灵活性和易维护性。
应用:将大的接口拆分成多个小接口,让实现类只依赖于它们需要的接口。比如在设计一个类库时,为不同的客户端设计专门的接口。
应用的设计模式:
-
适配器模式(Adapter Pattern):通过将接口转换成客户端期望的接口,使得客户端只依赖于需要的接口部分。
-
代理模式(Proxy Pattern):定义一个代理接口,使得客户端只依赖于代理接口,从而避免与被代理对象的紧耦合。
6. 合成/聚合复用原则(Composite/Aggregate Reuse Principle, CARP)
定义:优先使用对象的组合/聚合,而不是继承来达到复用的目的。
解释:
-
组合和聚合通过在类中包含其他类的实例来实现功能,而不是通过继承。这种方式使得系统更加灵活,因为组件可以独立于其他部分修改和替换。
-
组合表示“有一个”关系,聚合是更弱的“有一个”关系,部件可以独立存在。
应用:使用组合和聚合代替继承来实现类之间的功能复用,例如,装饰者模式和策略模式。
应用的设计模式:
-
装饰者模式(Decorator Pattern):通过组合多个装饰器类来扩展对象的功能,而不是通过继承。
-
组合模式(Composite Pattern):通过组合对象来构建树形结构,使得整体与部分可以被统一处理,而不是依赖于继承。
7. 迪米特法则(Law of Demeter, LoD)
定义:一个对象应尽可能少地了解其他对象,特别是不应该了解它们的内部细节。
解释:
-
对象只应该与直接相关的对象交互,而不应涉及到不相关的对象。这样可以减少类之间的耦合,提高系统的可维护性。
-
该法则也被称为“最少知识原则”。
应用:避免调用链条式的访问(如 objA.getB().getC().doSomething()
),而是通过中间类的方法来封装和处理。
应用的设计模式:
-
中介者模式(Mediator Pattern):通过引入中介者对象来管理对象之间的通信,减少了对象之间的直接依赖,符合迪米特法则。
-
观察者模式(Observer Pattern):观察者模式中的主题(Subject)与观察者(Observer)之间通过事件进行通信,而不是直接访问彼此的内部状态,符合迪米特法则。
总结
这些面向对象设计原则旨在帮助开发者构建健壮、灵活和可维护的软件系统。理解和应用这些原则不仅可以改善代码质量,还能有效地应对未来的需求变化和扩展。这些原则在许多设计模式中都有具体的体现,是设计模式得以成功应用的基础。
推荐阅读
设计模式中的类关系-CSDN博客
面向对象设计原则-CSDN博客
Java之23种设计模式介绍-CSDN博客
Java之23种设计模式代码示例_java好用的设计模板编程-CSDN博客