【60天备战软考高级系统架构设计师——第九天:面向对象设计原则】
面向对象设计原则(Object-Oriented Design Principles)
面向对象设计原则是指导如何设计和编写健壮、可维护、可扩展的面向对象系统的重要准则。遵循这些设计原则能够帮助开发人员避免代码腐化,降低系统的复杂性。以下是几种常见的面向对象设计原则:
1. 单一职责原则(SRP, Single Responsibility Principle)
单一职责原则规定一个类应该只有一个引起它变化的原因,也就是一个类应该只负责一项职责。如果一个类承担的职责过多,就意味着这个类的职责耦合在了一起,任何一个职责的变更都会影响到类的其他功能,导致维护困难。
-
优点:
- 降低类的复杂性,使类更易于理解和修改。
- 提高类的可重用性,增强系统的灵活性。
-
应用场景:在设计类时确保每个类只负责一种功能,如数据库操作类、业务逻辑类、UI渲染类等。
-
示例:
public class UserService { public void createUser() { // 负责创建用户 } } public class UserRepository { public void saveUser() { // 负责保存用户到数据库 } }
2. 开放封闭原则(OCP, Open-Closed Principle)
开放封闭原则规定一个软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。这意味着在增加新功能时,应该通过扩展已有的代码结构来实现,而不是通过修改已有代码来实现。
-
优点:
- 提高系统的扩展性和可维护性。
- 减少代码修改的频率和风险。
-
应用场景:在系统需求变化频繁时,通过接口或抽象类来设计功能扩展点。
-
示例:
public interface PaymentMethod { void pay(); } public class CreditCardPayment implements PaymentMethod { public void pay() { System.out.println("Paying with credit card."); } } public class PaymentService { public void processPayment(PaymentMethod paymentMethod) { paymentMethod.pay(); } }
3. 里氏替换原则(LSP, Liskov Substitution Principle)
里氏替换原则规定在软件中,所有引用基类的地方必须能透明地使用其子类的对象。也就是说,子类对象应该可以替换父类对象而不影响程序的功能。
-
优点:
- 提高代码的灵活性和可扩展性。
- 保证代码的健壮性,避免类型错误和异常。
-
应用场景:在继承关系中,通过确保子类能够替代父类而不引入新错误来实现代码的重用。
-
示例:
public class Rectangle { private int width; private int height; // getters and setters } public class Square extends Rectangle { // Should not break LSP by overriding setHeight() or setWidth() to alter both dimensions. }
4. 依赖倒置原则(DIP, Dependency Inversion Principle)
依赖倒置原则规定高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
-
优点:
- 减少模块间的耦合,提高系统的灵活性和可扩展性。
- 提高代码的重用性,便于测试和维护。
-
应用场景:在系统中通过接口或抽象类来解耦高层模块和低层模块。
-
示例:
public interface NotificationService { void sendNotification(String message); } public class EmailNotificationService implements NotificationService { public void sendNotification(String message) { System.out.println("Sending email: " + message); } } public class NotificationManager { private NotificationService notificationService; public NotificationManager(NotificationService notificationService) { this.notificationService = notificationService; } public void notifyUser(String message) { notificationService.sendNotification(message); } }
5. 接口隔离原则(ISP, Interface Segregation Principle)
接口隔离原则规定客户端不应该依赖那些它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。接口隔离原则可以避免“胖接口”的问题。
-
优点:
- 提高系统的灵活性和可扩展性。
- 减少接口变更对系统的影响。
-
应用场景:在系统设计时,通过定义多个细粒度的接口来避免对不必要方法的依赖。
-
示例:
public interface Flyable { void fly(); } public interface Swimmable { void swim(); } public class Duck implements Flyable, Swimmable { public void fly() { System.out.println("Duck flying."); } public void swim() { System.out.println("Duck swimming."); } }
例题:
-
单一职责原则的主要目的是?
A. 增加类的复杂性
B. 确保一个类只有一个职责,提高可维护性
C. 确保类之间的耦合性
D. 增加代码量答案:B
-
开放封闭原则的核心思想是什么?
A. 类对扩展开放,对修改封闭
B. 类对扩展封闭,对修改开放
C. 类对扩展和修改都开放
D. 类对扩展和修改都封闭答案:A
-
依赖倒置原则要求高层模块依赖于什么?
A. 低层模块
B. 抽象
C. 具体实现
D. 数据库答案:B
-
接口隔离原则建议的是什么?
A. 创建一个大而全的接口
B. 创建多个细粒度的接口
C. 使用继承来实现接口
D. 所有类实现同一个接口答案:B
小结:
今天我们深入学习了面向对象设计的五大原则:单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。遵循这些原则可以帮助我们设计出高效、易维护和灵活的系统架构。