面向对象设计原则

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博客

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值