第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语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题.为了解决.克服这个难题,笔主特别开了这个博客来记录自己学习的 ...
随机推荐
- 批处理清除VisualStudio解决方案文件夹
有很多次我们需要手工来删除bin, obj这样的文件夹.这些文件夹是由Visual Studio编译项目时生成的,其中包括了当前项目的程序集.一个解决方案会包含好多个项目了,那么就有很多这样 ...
- weblogic 12c下jxls导出excel报错Could not initialize class org.apache.poi.xssf.usermodel.XSSFVMLDrawing
周一,开发反馈weblogic 12c下jxls导出excel报错,公司环境和UAT环境均报错,看日志如下: 2016-06-08 09:16:55,825 ERROR org.jxls.util.T ...
- linux查看rpm包创建的所有目录和文件
有不少时候,我们需要查看某个rpm创建的所有目录和文件,出于了解程序结构或者其他目的,但是对于这个rpm包我们又不怎么熟悉,这个时候可以通过rpm -ql rpm名称查看. 但是rpm名称有可能又忘了 ...
- UML类图相关实践
最近看了下设计模式,其中无可避免会设计很多类图,UML类图对于学习设计模式很重要,关于设计模式,我也会在这里写上一写,这一篇关于UML类图的就先当个铺垫. 1.先上一个简单的类图来简单说明下: 1). ...
- JS之跨域
今天学了跨域,迫不及待想跟大家分享!不妥之处希望大家指正. 首先来明确一下"跨域"这个概念. 跨域指的是,到外域去取数据.那什么是"外域"呢?我们先来了解同域. ...
- 解决SSIS中的脚本任务无法调试的问题
开发环境:操作系统环境为Win7 64Bit,数据库为SQLServer2008R2 问题现象:在SSIS的项目工程中,新建Package包,新建脚本任务,编写脚本程序以后,设置断点无法调试(Debu ...
- Struts2原理
Struts 2以WebWork优秀的设计思想为核心,吸收了Struts 1的部分优点,建立了一个兼容WebWork和Struts 1的MVC框架,Struts 2的目标是希望可以让原来使用Strut ...
- App开发流程之配置Info.plist文件
Info.plist文件控制应用的全局配置,例如bundle name,display name. 先来看一下默认创建的Info.plist文件 右键左侧的Info.plist文件,可以open as ...
- 【读书笔记】iOS-头文件导入-@class注意事项
一,导入头文件有两种不同的方法:使用引号或者使用尖括号,例如,#import <Cocoa/Cocoa.h>和#import "Tire.h".带尖括号的语句是用来导入 ...
- MyBatis入门(三)---多个参数
一.建立表 1.1.建立表,并插入数据 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybatis *** ...