开放—封闭原则(The Open-Close Principle, OCP)

“变化是永恒的主题,不变是相对的定义”​。软件系统也是如此,任何系统在其生命周期中都需要有应对变化的能力,这也是体现设计质量的一个最重要的功能。那么,什么样的设计才能应对需求的变更,且可以保持相对稳定呢

概念

不能修改已有的软件模块(即修改封闭)​,从而不影响依赖于该模块的其他模块;通过对已有模块扩展新模块来扩展模块功能(即扩展开放)​,从而应对需求变更或新需求。

应用分析

  • 实现开放—封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以对修改就是封闭的。
  • 通过面向对象的继承和多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。这是实现开放—封闭原则的基本思路。

例子1

以下的图展示了一种典型的违背OCP的设计方案。
在这里插入图片描述
Client和Server都是具体类,Client使用Server中提供的服务。在该设计方案中,如果Client需要使用另外一个不同的服务器对象,就必须把Client类中使用Server的地方全部修改为新的服务器类。显然,这违背了OCP,需要修改Client来应对Server的变更。考虑此设计方案违背OCP的原因是Client可能面对不同的服务器,为此,可以把Client可能面对的不同服务器进行抽象,该抽象定义了Client需要服务器所提供的行为,但这些行为没有实现(需要具体的服务器来实现)​。
在这里插入图片描述
在该方案中,Client并不直接依赖于任何一个具体的服务器,而是将其所需要的行为定义为抽象接口Client Interface。任何能够提供这些服务的服务器将实现该接口。按照该设计方案,Server和Client之间是相互独立的,如果需要使用新的服务器,只需要从Client Interface接口下再实现一个新的类即可,原有的结构不需要进行任何修改。

优势

这就是OCP的魅力,遵循该原则将可以极大地提高软件的设计质量。而有效地利用该原则的关键就在于抽象,当预测到可能的变化时,就通过抽象来隔离它。

代价

此外,遵循OCP也需要付出一些代价。创建正确的抽象需要花费时间和精力;同时也增加了软件设计的复杂性。需要明确的一点是,一个模块不可能做到完全封闭,也不可能设计出对任何情况都适用的模型。因此,对OCP的应用应限定在那些可能发生变化的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值