[转] SOLID五大设计原则
我们知道,面向对象对于设计出高扩展性、高复用性、高可维护性的软件起到很大的作用。我们常说的SOLID五大设计原则指的就是:
S = 单一职责原则 Single Responsibility Principle
O = 开放闭合原则 Opened Closed Principle
L = Liscov替换原则 Liscov Substitution Principle
I = 接口隔离原则 Interface Segregation Principle
D = 依赖倒置原则 Dependency Inversion Principle
我们一一去解说面向对象的五大设计原则:
1. 单一职责原则
引起类变化的因素永远不要多于一个,或者说:一个类有且只有一个职责。
如果类包含多个职责,代码会变得耦合;SRP看起来是把事物分离成分子部分,以便于能被复用和集中管理,这点也同样适用于方法级别。
2. 开放封闭原则
软件实体(类,模块,函数等等)应当对扩展开放,对修改闭合。
如图:客户端和服务段都耦合在一起。那么,只要出现任何变化,服务端变化了,客户端一样需要改变。
下面则是正确的设计:对外关联接口或者抽象类
3.Liskov’s 替换原则
子类型必须能够替换它们基类型,或者说使用基类引用的函数必须能使用继承类的对象而不必知道它。
为什么LSP这么重要:
● 如果没有LSP,类继承就会混乱;如果子类作为一个参数传递给方法,将会出现未知行为;
● 如果没有LSP,适用与基类的单元测试将不能成功用于测试子类;
4. 接口分离原则
客户端不应该被迫依赖于它们不用的接口
接口应该仅包含必要的方法,而不该包含其它的。比如:
注意到IBird接口包含很多鸟类的行为,包括Fly()行为.现在如果一个Bird类(如Ostrich鸵鸟)实现了这个接口,那么它需要实现不必要的Fly()行为(Ostrich不会飞). 这个”胖接口”应该拆分未两个不同的接口,IBird和IFlyingBird,IFlyingBird继承自IBird. 这里如果一种鸟不会飞(如Ostrich),那它实现IBird接口。如果一种鸟会飞(如KingFisher),那么它实现IFlyingBird
5. 依赖倒置原则
高层模块不应该依赖底层模块,两者都应该依赖其抽象。
比如说一个汽车类:
class Car{
AmericanEnginee e; //这样是不对的,应该依赖于接口,必须写成IEngine e;
}
如果代码中不用依赖倒置,我们将面临如下风险:
● 使用低级类会破环高级代码;
●当低级类变化时需要很多时间和代价来修改高级代码;
● 产生低复用的代码;
除SOLID原则外还有很多其它的面向对象原则。如:
“组合替代继承”:这是说相对于继承,要更倾向于使用组合;
“笛米特法则”:这是说”你的类对其它类知道的越少越好”;
“共同封闭原则”:这是说”相关类应该打包在一起”;
“稳定抽象原则”:这是说”类越稳定,越应该由抽象类组成”;
[转] SOLID五大设计原则的更多相关文章
- SOLID架构设计原则
最近通读了<架构整洁之道>,受益匪浅,遂摘选出设计原则部分,与大家分享,希望大家能从中获益. 以下为书中第3部分 设计原则的原文. 设计原则概述 通常来说,要想构建-个好的软件系统,应该从 ...
- [设计模式]面向对象五大设计原则:SOLID
SOLID (面向对象设计) 单一功能原则(Single responsibility principle) 每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来 所有它的(这个类的)服务 ...
- Java项目中常用的的五大设计原则
今天我们一起来聊聊关于设计原则相关的知识点. SOLID五大原则是什么 SRP 单一责任原则 单一责任原则,从名字上我们就能比较好的去理解它.这项原则主张一个对象只专注于单个方面的逻辑,强调了职责的专 ...
- oop五大设计原则
一:单一职责原则单一职责有2个含义,一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责.减少类的耦合,提高类的复用性. 二:接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接 ...
- 浅谈Java五大设计原则之观察者模式
定义一下观察者模式: 观察者模式又叫 发布-订阅 模式,定义的两个对象之间是一种一对多的强依赖关系,当一个对象的状态发生改变,所有依赖它的对象 将得到通知并自动更新(摘自Hand First). ...
- 浅谈Java五大设计原则之代理模式
我们来定义一下 AOP(面向切面编程) 它是面向对象的一种补充或者是一种增强,它在这基础上增加了一些 而外的功能增强. 它可以在原有的行为不改变的前提,在这之前或者之后完成一些而外 的事情. 而AO ...
- 浅谈Java五大设计原则之责任链模式
首先我们得先定义一个责任链模式: 责任链模式是一种线性执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中, 由于执行的权利和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个 ...
- 面向对象设计SOLID五大原则
转载自:码农社区,http://w3croom.com/read.php?tid-4522.html 今天我给大家带来的是面向对象设计SOLID五大原则的经典解说. 我们知道,面向对象对于 ...
- JavaScript设计模式之设计原则
何为设计 即按照哪一种思路或者标准来实现功能,功能相同,可以有不同的设计方案来实现 伴随着需求的增加,设计的作用就会体现出来,一般的APP每天都在变化,更新很快,需求不断在增加,如果设计的不好,后面很 ...
随机推荐
- 基于JS的问卷调查
主要工作 因为代码不好展示,也不好截长图,可以去看我的GitHub地址:https://github.com/14glwu/MyBlog/blob/master/questionnaire.html ...
- ThinkPHP框架之空控制器
HOME代表的是模块 前台可以用Home 后台用Admin Model View Controller 统称为MVC Model 是数据模型 主要是和数据库打交道的 View代表显 ...
- ASP.NET Core实现强类型Configuration读取配置数据
前言 实现读取JSON文件几种方式,在项目中采取老办法简单粗暴,结果老大过来一看,恩,这样不太可取,行吧那我就用.NET Core中最新的方式诺,切记,适合的才是最好的,切勿懒. .NET Core读 ...
- 2017TSC世界大脑与科技峰会,多角度深入探讨关于大脑意识
TSC·世界大脑与科技峰会是全世界范围内的集会,多角度深入探讨关于大脑意识体验来源这一根本话题,我们是谁,现实的本质是什么,我们所处宇宙空间的本质为何.该峰会由亚利桑那大学意识研究中心主办. 会议时间 ...
- Scrollview中嵌套ListView(自定义组件解决)
首先,ScrollView中只能放一个控件,一般都放LinearLayout,orientation属性值为vertical.在LinearLayout中放需要呈现的内容.ListView也在其中,L ...
- 二、Windows基础数据类型
六.Windows Data Types 简介: 6.1.这些数据类型都是C语言数据类型的再次的进行包装. 6.2.因为考虑到如果使用的是C中的基础数据类型可能无法表示,想表示的精准的含义. 6.3. ...
- 每个国家对应的语言Locale和国家代码对照表
DNN3支持多语言,希望下面的语言代码与对应国家能对你有所帮助 语言代码 国家/ 地区 "" (空字符串) 无变化的文化 af 公用荷兰语 af-ZA 公用荷兰语 - 南非 sq ...
- 堆和栈(java内存)
栈内存: 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为 ...
- Nuget常用命令操作
Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加.移除和更新引 ...
- Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理
原文:发表于 2013 年 8 月 26 日 由 三石 0. 处理器发展和需求背景 回想一下并发开发的初衷,其实可以说是有两点,或者说可以从两个方面看. 对于单核的处理器来说,在进行IO操作等比较费时 ...