目录
-
- 概况
- 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)
- 7. 合成复用原则(Composite Reuse Principle, CRP)
- 总结
概况
在软件开发中,为了提高软件系统的可维护性与可复用性,增加软件系统的可扩展性与灵活性,程序员要尽量遵循这七条原则去开发程序。遵循设计原则的开发,可以很好地提高软件开发效率、节约软件开发与维护成本。
这七种设计原则的侧重点不同。其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。
但在实际的软件开发实践中,并不是一定所有代码都遵循设计原则,而是要综合考虑人力、时间和成本,不刻意去追求完美,要在适当的场景下去遵循适用的设计原则。这是一种平衡取舍,可以帮助我们设计出更有质量、更优雅的代码。
七大软件设计原则包括开闭原则、依赖倒置原则、 单一职责原则、接口隔离原则、迪米特法则、里氏替换原则、合成复用原则:
1. 单一职责原则(Single Responsibility Principle, SRP)
一个类应该只有一个引起变化的原因。换句话说,一个类应该只有一个职责。这样做的好处是使代码更加高内聚,修改某一个职责不会影响到其他职责。
public class UserManager {
public void createUser(User user) {
// 创建用户的逻辑
}
public void updateUser(User user) {
// 更新用户的逻辑
}
public void deleteUser(int userId) {
// 删除用户的逻辑
}
}
2. 开放封闭原则(Open Closed Principle, OCP)
软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。换句话说,当需求变化时,我们应该尽量通过扩展已有的实体来实现,而不是修改原有的代码。这样做的好处是降低修改代码的风险,并且便于维护和扩展。
public interface Shape {
double calculateArea();
// 可以添加其他计算相关的方法
}
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double calculateArea() {
return width * height;
}
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}