第2章 面向对象的设计原则(SOLID):6_开闭原则
6. 开闭原则(Open Closed Principle,OCP)
6.1 定义
(1)一个类应该对扩展开放,对修改关闭。要求通过扩展来实现变化,而且是在不修改己有的代码情况下进行扩展,也不必改动己有的源代码或二进制代码。
(2)在软件生命周期内,变化是一个既定的事实,在设计时尽量适应这些变化,以提高项止的稳定性和灵活性,真正实现“拥抱变化”。而开闭原则告诉我们要通过扩展来实现这些变化而不是修改原来代码。
(3)修改关闭,并不意味着软件不做任何的改动,低层模块的变更,必然要高层模块进行耦合,否则就是一个弧立无意义的代码片段。
6.2 开闭原则优点
(1)通过扩展己有的功能,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性
(2)己有的软件模块,特别是最重要的抽象层模块不能再修改,这就使得变化中的软件有一定的稳定性和延续性
(3)同时满足了可复用性与可维护性
6.3 如何使用开闭原则
(1)抽象约束
①通过接口或抽象类约束扩展,对扩展进行边界限定。通过接口,只能使用由接口提供的方法。
②参数类型、引用对象尽量使用接口或抽象类,而不是具体的实现类
③抽象层尽量保持稳定,一旦确定就不要修改。
(2)元数据(metadata)控制模块行为
元数据就是用来描述环境和数据的数据。尽量使用元数据来控制程序的行为,减少重复开发。
(3)制定项目章程
(4)封装变化
①将相同的变化封装到一个接口或抽象类中;变化不应当散落在代码的许多角落,而应当被封装到一个对象里。同一种变化的不同表象意味着是同一个继承等级结构中的具体子类。
②将不同的变化封装到不同的接口或抽象类中,不应该有两个不同变化出现在同一个接口或抽象类。一种变化与另一种变化混合在一起,会违反单一性原则,所以应被分开。
6.4 最佳实践
(1)几种设计原则的小结(6个原则的首字母组合单词(S.O.L.I.D,表示稳定)
①单一职责原则告诉我们实现类要职责单一;
②里氏替换原则告诉我们不要破坏继承体系;
③依赖倒置原则告诉我们要面向接口编程;
④接口隔离原则告诉我们在设计接口的时候要精简单一;
⑤迪米特法则告诉我们要降低耦合。
⑥开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
(2)建立稳定、灵活、健壮的设计,开闭原则是最基础的原则,也是精神领袖
(3)开闭原则是最基础的一个原则,前五个原则都是开闭原则的具体形态,而开闭原则才是灵魂。换一个角度,借用OOP的说法,开闭原则是抽象类,其他五大原则是具体的实现类。
第2章 面向对象的设计原则(SOLID):6_开闭原则的更多相关文章
- C#软件设计——小话设计模式原则之:开闭原则OCP
前言:这篇继续来看看开闭原则.废话少说,直接入正题. 软件设计原则系列文章索引 C#软件设计——小话设计模式原则之:依赖倒置原则DIP C#软件设计——小话设计模式原则之:单一职责原则SRP C#软件 ...
- 【面向对象设计原则】之开闭原则(OCP)
开闭原则是面向对象设计的一个重要原则,其定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进 ...
- 面向对象设计原则二:开闭原则(OCP)
开闭原则(OCP)定义:对扩展开发,对修改关闭.好处: 适应性和灵活性. 稳定性和延续性. 可复用性与可维护性. 解释说明:开闭原则指的是两方面:对功能扩展开发,对修改进 ...
- 【设计模式六大原则6】开闭原则(Open Close Principle)
定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不 ...
- 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)
2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...
- C# 实例解释面向对象编程中的开闭原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...
- 设计原则:开-闭原则(Open-Closed Principle, OCP)
开-闭原则就是软件实体应当对扩展开放,对修改关闭.(Software entities should be open for extension,but closed for modification ...
- Java设计原则—开闭原则(转)
原文出自:http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html 开闭原则(Open Closed Principle)是Ja ...
- Java设计模式(1:软件架构设计七大原则及开闭原则详解)
前言 在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题.为了解决.克服这个难题,笔主特别开了这个博客来记录自己学习的 ...
随机推荐
- FPSCalc——简单FPS观测类
利用Unity做的手游项目很多时候要保证流畅度,流畅度最直观的表现就是帧率FPS.Unity编辑器模式下的帧率观测几乎没有意义,所以还是自己实现的好. 这里给一个前人写的类,我几乎原封不动,该类只有一 ...
- 解决Spring MVC @ResponseBody返回html中中文字符串乱码问题
最近有个应用,通过responsebody返回完整的html页面时出现乱码是异常的问题,因为是通过responsebody返回,所以一开始设置了text/plain的字符集,如下: <mvc:a ...
- docker 使用
https://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-docker-application http ...
- VS2010在空解决方案中添加项目
如题,在空解决方案中添加第一个项目的时候会看不到那个solution解决方案文件,而是你当前添加的项目,当你再添加其他项目的时候就悲催了,找不到这个solution,只能在这个项目文件上新加文件,很郁 ...
- js 中{},[]中括号,大括号
1. { } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如: var LangShen = {"Name":"Langshen",& ...
- ABAP modify screen:修改屏幕,实现隐藏、禁止输入字段
Loop at screen会loop处理屏幕上的每一个组件,并对其做相应的处理. SELECTION-SCREEN: BEGIN OF BLOCK B1 WITH FRAME.PARAMETERS ...
- android Json详解
Json:一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.J ...
- 高级iOS面试题
非标准答案 2 1: 类方法是可以直接通过类名直接调用,无需进行实例化对象.类方法是以+开头2. 实例方法,需要显示实例化对象,为对象分配堆栈空间,并通过对象实例调用实例方法3. RUNTIME 是在 ...
- Validation of viewstate MAC failed. 解决方法
前段时间公司为了减轻服务器压力,对网页做了集群,分布在多台服务器,通过DNS轮回解析到各台服务器,结果页面只要打开停留到DNS解析到下一个地址,就会出现出下错误信息. Validation of vi ...
- linux命令之 用户和群组
一.保存用户信息的文件 1 /etc/passwd root:x:::root:/root:/bin/bash pwftp:x::::/alidata/www/wwwroot/:/sbin/nolog ...