当前位置: 首页 > article >正文

【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.");
        }
    }
    

例题:

  1. 单一职责原则的主要目的是?
    A. 增加类的复杂性
    B. 确保一个类只有一个职责,提高可维护性
    C. 确保类之间的耦合性
    D. 增加代码量

    答案:B

  2. 开放封闭原则的核心思想是什么?
    A. 类对扩展开放,对修改封闭
    B. 类对扩展封闭,对修改开放
    C. 类对扩展和修改都开放
    D. 类对扩展和修改都封闭

    答案:A

  3. 依赖倒置原则要求高层模块依赖于什么?
    A. 低层模块
    B. 抽象
    C. 具体实现
    D. 数据库

    答案:B

  4. 接口隔离原则建议的是什么?
    A. 创建一个大而全的接口
    B. 创建多个细粒度的接口
    C. 使用继承来实现接口
    D. 所有类实现同一个接口

    答案:B

小结:

今天我们深入学习了面向对象设计的五大原则:单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。遵循这些原则可以帮助我们设计出高效、易维护和灵活的系统架构。


http://www.kler.cn/a/294433.html

相关文章:

  • 在C++上实现反射用法
  • SCUI Admin + Laravel 整合
  • 【MySQL】数据库知识突破:数据类型全解析与详解
  • R语言机器学习与临床预测模型69--机器学习模型解释利器:SHAP
  • 提升法律文书处理效率的秘密武器:开源文档比对工具解析
  • LabVIEW编程基础教学(一)--介绍
  • [SUCTF 2018]annonymous1
  • 移动UI:成就勋章页面该如何设计,用例子说明。
  • 大数据决策分析平台建设方案(56页PPT)
  • SpringBoot2:请求处理原理分析-RESTFUL风格接口
  • 交换机自动化备份配置(H3C_无人值守)
  • 前端小白操作指南:如何删除项目中 pre-commit 的提交限制?
  • 【机器人工具箱Robotics Toolbox开发笔记(十五)】六自由度机器人笛卡尔空间轨迹规划仿真实例
  • 过去十年中,深度学习领域经历了许多重要的算法创新和突破。以下是一些关键的深度学习算法,按照时间顺序排列:
  • ChatGPT在医疗行业的应用前景与挑战探析
  • GraphRAG入门:基本概念、应用场景及学习方法
  • 2024国赛数学建模A题B题C题D题E题思路资料模型
  • yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距
  • AI基础 L1 Introduction to Artificial Intelligence
  • Prometheus + Grafana + nVisual 实现运维监控全面可视化
  • 【区块链 + 物联网】基于电子标签的区块链溯源系统 | FISCO BCOS应用案例
  • QT Android开发之Android端usb调试模式设置与问题解决
  • 分类算法可视化方法
  • 【机器学习】表示学习的基本概念和方法以及编解码结构的基本概念
  • C++设计模式之:单例模式singleton
  • HTTP 一、基础知识