首页 > 编程语言 >面向对象编程的 SOLID 原则 - 开闭原则

面向对象编程的 SOLID 原则 - 开闭原则

时间:2023-07-29 16:45:31浏览次数:36  
标签:InvoicePersistence invoice 原则 SOLID class 添加 面向对象编程 save public

开闭原则

开闭原则要求“class 应该对扩展开放对修改关闭”。

修改意味着修改存在 class 的代码,扩展意味着添加新的功能。

这个原则想要表达的是:我们应该能在不动 class 已经存在代码的前提下添加新的功能。这是因为当我们修改存在的代码时,我们就面临着创建潜在 bug 的风险。因此,如果可能,应该避免碰通过测试的(大部分时候)可靠的生产环境的代码。

你可能会好奇,怎样不动 class 还能添加新功能,接口和抽象类可以做到。

现在基本概念已经介绍完了,让我们给发票应用应用一下这个原则。

假如老板来了,提了一个需求,他们想把发票存入数据库以方便查找。我一想,行啊,小菜一碟,五分钟搞定。

创建数据库,连接,给 InvoicePersistence 添加保存方法:


public class InvoicePersistence {
    Invoice invoice;

    public InvoicePersistence(Invoice invoice) {
        this.invoice = invoice;
    }

    public void saveToFile(String filename) {
        // Creates a file with given name and writes the invoice
    }

    public void saveToDatabase() {
        // Saves the invoice to database
    }
}

很不幸,作为书店的懒家伙,并没有把 class 设计的易于未来扩展。为了添加这一特性,需要修改 InvoicePersistence class。

如果 class 设计遵循开闭原则,我们就不需要修改这个 class 了。

因此,作为书店里聪明的懒家伙,我们发现了设计问题并决定重构代码以符合开闭原则。


interface InvoicePersistence {

    public void save(Invoice invoice);
}

我们把 InvoicePersistence 改成了接口类型并添加了 save 方法。每个持久化 class 都实现这个 save 方法。


public class DatabasePersistence implements InvoicePersistence {

    @Override
    public void save(Invoice invoice) {
        // Save to DB
    }
}


public class FilePersistence implements InvoicePersistence {

    @Override
    public void save(Invoice invoice) {
        // Save to file
    }
} 

现在持久化逻辑更易于扩展了,如果老板要求我们添加另一个数据库,有了两种不同类型的数据库如 MySQL和 MongoDB ,可以更快搞定了。

你可能会想,我们只需创建多个 class 给每个都添加一个 save 方法而无需接口。

来看一下如果我们不用接口来扩展 app,创建多个持久化 class 如 InvoicePersistence, BookPersistence ,还需要创建了一个 PersistenceManager class 来管理所有的持久化 class:


public class PersistenceManager {
    InvoicePersistence invoicePersistence;
    BookPersistence bookPersistence;
    
    public PersistenceManager(InvoicePersistence invoicePersistence,
                              BookPersistence bookPersistence) {
        this.invoicePersistence = invoicePersistence;
        this.bookPersistence = bookPersistence;
    }
}

有了多态,我们可以把任何实现了 InvoicePersistence 接口的 class 作为入参。这就是接口的灵活性。

标签:InvoicePersistence,invoice,原则,SOLID,class,添加,面向对象编程,save,public
From: https://www.cnblogs.com/gongxianjin/p/17590041.html

相关文章

  • 定制化SOLIDWORKS插件开发服务流程解析
    SOLIDWORKS是一套三维设计软件,采用特征建模、变量化驱动可方便地实现三维建模、装配和生成工程图。SOLIDWORKS软件本身所具有的交互方式,可以使用户对已生成模型的尺寸、几何轮廓和相互约束关系随时进行修改,而不需要编程。SOLIDWORKS软件本身的方程式可以实现简单的参数逻辑变......
  • terrasolid是什么?和microstation v8i的关系?
    Terrasolid这款软件需要在MicroStationV8i这个软件的运行环境下才能使用。参考:https://www.cnblogs.com/yibeimingyue/p/15589355.html参考2:https://wenku.baidu.com/view/4f5aa22e660e52ea551810a6f524ccbff121ca1b.html参考3:https://download.csdn.net/download/hhudxy2010/......
  • 响应式网页设计应该注意的9个原则
    响应式网站越来越受到大家的欢迎,有利也有弊的因素。它没有固定的页面尺寸、没有毫米或英寸,没有任何物理限制,让人感到无从下手。下面就和大家分析如何运用响应式web设计的各项基本原则来实现。为了简单起见,就说说响应式网站的布局。希望对你有所受益。1、Web字体Vs系统字体想让自......
  • solidworks api ch04
    用默认模板新建零件,并修改用户偏爱:letnewPart(swApp:ISldWorks)=//GetthefilepathofthedefaultparttemplateletpartTemplate=swApp.GetUserPreferenceStringValue(intswUserPreferenceStringValue_e.swDefaultTemplatePart)letswModel=......
  • SOLIDWORKS PDM中如何快速生成BOM,SolidKits助您一臂之力
    在SOLIDWORKSPDM中,生成BOM操作是比较简单的,但前提条件是我们的模型必须具有相应的属性信息才可以。SolidKits.Reports企业高级报表软件给用户提供了一种更加便捷的出BOM的方式,使我们的工作效率更高,其使用方法也非常简单,我们一起来看下操作步骤吧!首先找到需要生成BOM的总成文件,然......
  • 索引的建立原则?什么是索引?如何建立一个好的索引?
    索引的本质其实就是一种排好序的数据结构。1.必须遵循唯一的索引原则,将其使用的作为索引的字段必须是唯一的,这样涉及的原则跟好处就是,唯一的索引会避免数据库去查询的时候会产生两样性,从而导致索引的查找的速率大大降低。2.索引的设计要根据where关键字跟orderby关键字还有gru......
  • 软件设计七项原则
    一、软件设计七项原则总结归纳设计原则归纳总结开闭原则对扩展开放,对修改关闭里氏替换原则不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义依赖倒置原则高层不应该依赖低层,要面向接口编程单一职责原则一个类只干一件事,实现类要单一......
  • 面向对象编程
    面向对象编程初识面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么...面向过程适合处理一些较为简单的问题面向对象思想物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考.最后,才对某个分类下的细节进行面向过程的思......
  • terrasolid自定义点云读取格式
    步骤如下:  ......
  • 面向对象编程(Object-Oriented Programming,OOP)
    面向对象编程(Object-OrientedProgramming,OOP)是一种编程思维方式和编码架构,是一种 对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。什么是对象:对象是客观存在的事物,可以说任何客观存在的都是可以成为对象,一台电脑,一直钢笔,一个人,一辆轿车等等,都可......