面向对象编程的 SOLID 原则 - 开闭原则 - OCP
开闭原则
开闭原则要求“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 作为入参。这就是接口的灵活性。
本文来自博客园,作者:易先讯,转载请注明原文链接:https://www.cnblogs.com/gongxianjin/p/17590041.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
2022-07-29 智能机器人方案
2022-07-29 这4个方法将提高你的理解力,成为一个超强学习达人!
2019-07-29 Crond服务+Shell实现秒级任务
2019-07-29 全栈工程师
2019-07-29 nginx配置https后,网站出现无法访问情况
2019-07-29 shell文件报错syntax error near unexpected token '$'\r''