首页 > 其他分享 >面向对象设计原则实验之“合成复用原则”

面向对象设计原则实验之“合成复用原则”

时间:2024-04-07 17:31:54浏览次数:30  
标签:原则 子类 数据库 复用 面向对象 CustomerDAO DBUtil 连接

优先使用对象组合,而不是通过继承来达到复用的目的。

某软件公司开发人员在初期的 CRM (客户关系管理)系统设计中考虑到客户数量不多。系统采用 Access 作为数据库,与数据库操作有关的类(例如 CustomerDAO 类等)都需要连接致据库,连接数据库的方法 getConnection() 封装在 DBUtil 类中,由于需要重用 DBUtil 类的 getConnection() 方法,设计人员将 CustomerDAO 作为 DBUtil 类的子类,初始设计方案结构如下图所示。

e82171a0754c1c517b641a371057b457.png

随着客户数量的增加,系统决定升级为 Oracle 数据库。因此需要增加一个新的 OracleDBUtil 类来连接 Oracle 数据库。由于在初始设计方案中 CustomerDAO 和 DBUtil 之间是继承关系。因此在更换数据库连接方式时需要修改 CustomerDAO 类的源代码。将 CustomerDAO 作为 OracleDBUtil 的子类,这将违反开闭原则。当然也可以直接修改 DBUtil 类的源代码,这同样也违反了开闭原则。

现使用合成复用原则对其进行重构。

解析(参考):

根据合成复用原则,在实现复用时应该多用关联,少用继承。因此在本实例中可以使用关联复用来取代继承复用,重构后的结构如图所示。

在图中,CustomerDAO 和 DBUtil 之间的关系由继承关系变为关联关系,采用依赖注入的方式将 DBUtil 对象注入到 CustomerDAO 中,可以使用构造注入,也可以使用设值注入。如果需要对 DBUtil 的功能进行扩展,可以通过其子类来实现,例如通过子类OracleDBUtil 来连接 Oracle 数据库。由于 CustomerDAO 针对 DBUtil 编程,根据里氏代换原则,DBUtil 子类的对象可以覆盖 DBUtil 对象,只需在 CustomerDAO 中注人子类对象即可使用子类所扩展的方法。例如在 CustomerDAO 中注入 OracleDBUtil 对象,即可实现Oracle 数据库连接,原有代码无须进行修改,而且可以很灵活地增加新的数据库连接方式,符合开闭原则。

feaea418824d4858a407b88bbdc510fb.png

标签:原则,子类,数据库,复用,面向对象,CustomerDAO,DBUtil,连接
From: https://blog.csdn.net/weixin_68443051/article/details/137410096

相关文章

  • SWEN20003面向对象软件开发项目
    SWEN20003面向对象软件开发项目1,2024墨尔本大学计算机与信息系统学院SWEN20003面向对象软件开发项目1,2024年第1学期发布时间:2024年3月25日星期一,美国东部时间晚上11:30首次提交截止时间:2024年3月28日星期四,美国东部时间晚上11:30项目截止时间:2024年4月17日星期三上午11:30在开......
  • Python学习(八):python面向对象编程
    文章目录python面向对象编程类的定义类的实例化类的静态变量与静态方法类的静态变量类的静态方法@staticmethod类的类方法@classmethod类的继承单继承多继承多层继承类方法的重写类方法的重载调用父类的方法super函数python面向对象编程面向对象(ObjectOriented)......
  • python面向对象(二)继承:最直接的代码复用
    继承简介继承是指通过在创建类时提供另一个类(称为父类)的名称,来获取父类的属性与方法。继承最明显的作用就是节约代码量,不需要重复定义已经存在的属性与方法。但是深入思考就会发现,复用只是继承的附带作用,继承最有意义的一点,是将不同的类联系了起来,让不同的类之间能够有一定的共性......
  • 七大设计原则(一)
    一、单一职责原则单一职责原则指的是,在程序设计时,一个类或者一个接口的应该职责是唯一的。于此对应的,只有某种特定的原因,才能引起类或者接口的变动。单一职责原则要求我们不要设计大而全的接口,而是将其拆分为多个接口,每个接口只负责单一的职责。这样做有如下几个优点:容易复......
  • C++从入门到精通——初步认识面向对象及类的引入
    初步认识面向对象及类的引入前言一、面向过程和面向对象初步认识C语言C++二、类的引入C++的类名代表什么示例C++与C语言的struct的比较成员函数访问权限继承默认构造函数默认成员初始化结构体大小总结前言面向过程注重任务的流程和控制,适合简单任务和流程固定的......
  • rust 面向对象编程特性、模式与模式匹配、高级特征
    面向对象编程OOP学习了结构体、枚举,它们可以包含自定义数据字段,也可以定义内部方法,它们提供了与对象相同的功能。面向对象的四大特征:封装、继承、多态通过pub标记为公有的结构体,在其他模块中可以访问使用这个结构体。但是对于结构体内部字段,如果不用pub,则仍是私有的,则可以通过......
  • 面向对象--三大特征--继承
    1.继承:继承是面向对象三大特征之一,可以让类与类之间产生子父的关系.2.继承的格式:Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立继承关系.publicclassStudentextendsPerson{}Studnet称为子类(派生类),Person称为父类(基类或者超类).3.使......
  • 面向对象--三大特征--多态
    1.什么是多台:同种类型,表现不同形态.2.多态的表现形式:父类类型对象名称=子类对象.3.多态的前提:a.有继承/实现关系;b.有父类引用指向子类对象;例如:Fu f=newZi();c.有方法重写.4,多态的好处:使用父类作为参数,可以接受所有子类对象,体现多态的扩展性和便利.......
  • Python面向对象的理解
    ★静态方法、实例方法、类方法项目操作对象调用方式静态方法既不操作类也不操作实例对象类或实例对象实例方法操作实例属性实例对象类方法操作类属性类或实例对象★python私有方法和私有属性理解规律总结1.私有的属性,不能通过对象直接访问,但是可......
  • ssm基于面向对象的学生事务处理系统分析与设计论文
    摘要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生事务处理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理......