本文目录
- 1. 单一职责原则(Single Responsibility Principle,SRP)
- 2. 开放封闭原则(Open-Closed Principle,OCP)
- 3. 里氏替换原则(Liskov Substitution Principle,LSP)
- 4. 依赖倒置原则(Dependency Inversion Principle,DIP)
- 5. 接口隔离原则(Interface Segregation Principle,ISP)
- 6. 迪米特法则(Law of Demeter,LoD),也称为最少知道原则(Least Knowledge Principle,LKP)
- 7. 合成复用原则(Composite Reuse Principle,CRP)
1. 单一职责原则(Single Responsibility Principle,SRP)
一个类应该只负责一项职责,即一个类应该只有一个引起它变化的原因。
例子:
假设我们有一个User类,它负责处理用户登录、获取用户信息和更新用户信息。根据单一职责原则,我们可以将其拆分为三个类:UserLogin、UserInfo和UserUpdater。每个类只负责一个功能,这样当某个功能发生变化时,不会影响到其他功能。但是对于大型系统来说,需要注意过度分散可能会造成类的数量急剧上升,这也是需要考虑的点。
2. 开放封闭原则(Open-Closed Principle,OCP)
软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即应通过扩展来实现变化,而不是通过修改已有代码来实现。
例子:
考虑一个PaymentProcessor类,它负责处理支付。根据开放封闭原则,当需要添加新的支付方式时,我们不应该修改PaymentProcessor类的代码,而是应该扩展它。可以通过创建一个新的类,比如信用卡支付类CreditCardPaymentProcessor,让它继承PaymentProcessor来实现这个功能。
3. 里氏替换原则(Liskov Substitution Principle,LSP)
子类必须能够替换掉它们的父类。即在使用父类对象的地方,可以用子类对象替代,而不会产生任何错误或异常。
例子:
假设有一个Rectangle类和一个Square类,其中Square是Rectangle的子类。根据里氏替换原则,任何使用Rectangle对象的地方都应该能够用Square对象替换而不产生错误。因此,Square类必须满足Rectangle类的所有前置条件,并且Square的行为应该与Rectangle保持一致。
4. 依赖倒置原则(Dependency Inversion Principle,DIP)
高层模块不应该依赖低层模块,二者都应该依赖于抽象。换句话说,要针对接口编程,不要针对实现编程。
例子:
考虑一个HighLevelModule类和一个LowLevelModule类。HighLevelModule依赖于LowLevelModule的具体实现。根据依赖倒置原则,我们应该将依赖关系抽象化,让HighLevelModule依赖于LowLevelModule的接口而不是具体实现。这样,HighLevelModule就不会与LowLevelModule的具体实现紧密耦合。
5. 接口隔离原则(Interface Segregation Principle,ISP)
客户端不应该依赖它不需要的接口。即一个类对另一个类的依赖应该建立在最小的接口上。
例子:
假设有一个UserManagement接口,它包含了用户登录、获取用户信息和更新用户信息等多个方法。根据接口隔离原则,我们可以将这个接口拆分为多个更小的接口,如UserLoginInterface、UserInfoInterface和UserUpdaterInterface。这样,客户端只需要依赖它真正需要的接口,而不是一个庞大的接口。
6. 迪米特法则(Law of Demeter,LoD),也称为最少知道原则(Least Knowledge Principle,LKP)
一个对象应当对其他对象保持最少的了解。
例子:
在一个订单处理系统中,OrderProcessor类负责处理订单。它依赖于ProductCatalog类来获取产品信息。根据迪米特法则,OrderProcessor应该只与ProductCatalog的接口交互,而不是直接访问ProductCatalog的内部数据。这样,OrderProcessor对ProductCatalog的了解就被限制在了最小的接口上。
7. 合成复用原则(Composite Reuse Principle,CRP)
尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的。
例子:
一个Employee类和一个Manager类。根据合成复用原则,Manager类应该通过组合(即引入Employee对象)来实现其功能,而不是通过继承Employee类。这样,Manager类可以复用Employee类的功能,同时保持自己的独特行为。
以上这些原则都是面向对象设计的指导原则,它们有助于我们设计出更加灵活、可扩展和可维护的代码。