设计模式--6个设计原则
来源:互联网 发布:广州凯申物流 知乎 编辑:程序博客网 时间:2024/06/01 21:05
1、单一原则
简单定义:一个类只负责一个一项职责。
解决办法:当遇到违反单一职责的情况时,最直观的做法就是—
a) 将原来的类分成两个或者多个类;推荐
缺点:就是开销增大了,体现在:①分解类开销,②客户端修改开销
所以,有时为了某些要求,也会违反单一职责原则,如下,
b)修改相应的职责方法;
优点:特别简单(面向过程)
缺点:一旦职责发生变化,就需要不停的修改该方法
c)给当前类添加一个或多个新的方法;
优点:方法还是遵循单一职责原则,而且原来的方法不需要修改
缺点:可能造成方法过多,情况变复杂。
注意事项:所以在类简单,方法少的情况下可以违背单一原则,否则,还是遵守的好,没有绝对的单一职责,一旦需求变更,职责粒度分细,原来的符合单一职责的也会因此而不符合单一原则。
适用范围:面向对象以及面向模块设计。
2、里式替换原则
(源于一个来自买买提学院姓里的一个女士提出来的一套理论)
简答定义:每个引用基类的地方都必须能够透明引用其子类的对象。
—-也就是说,尽量不要重载父类中已经实现的方法,这样不至于导致原有父类的功能异常。
解决办法:子类不要重新父类已经实现了的方法,如果要重新父类的该方法,选用依赖、聚合、组合等关系代替。
其深层含义体现在:
1)子类不能覆盖父类的非抽象方法;
2) 当子类重载父类方法时,形参输入参数更加宽松;eg. int →double
3) 当子类 方法重载父类方法,返回值要比父类更加严格。
口诀:‘’前松后紧‘’。。
注意事项:遵守这一原则可以最大程度的代码功能保证不会出现错误,其他不做要求。
3、依赖倒置原则—“面向接口编程”
定义:高层模块不依赖于底层模块,二者都需要依赖于他们的抽象; 细节应该依赖于抽象,而不是反过来。
解决办法:让底层类们实现接口或者抽象类,让原来依赖底层类的通过接口与底层类发生练习。(如下图所示,A依赖于B,然后又依赖于C, A可以通过接口I和B,C发生联系)
注意事项:变量声明类型尽量使用抽象类和接口,底层也是如此,继承时当然需要遵守里氏
替换原则。
4、接口隔离原则—“分解细化接口”
定义:客户端不应该依赖他不要的接口,也就是说依赖建立在最小接口上。
解决办法:将原有的接口拆分为几个分散的接口。
注意事项:
1)不要过度分解,造成接口混乱。
2)为依赖接口的类分配其需要的方法,不要暴露其他方法(隐藏起来),提高高内聚,减少对外交互。
3)接口隔离与单一职责不同,一个注重细节实现,一个注重整体。
5、迪米特原则—最少知道
定义:类与类之间的耦合越低越好。(涉及到具体业务就是架构中的分层原理,相邻的层之间有关联,不要和非相邻层过于耦合,相邻的特点体现为:出现对应类的成员变量、方法参数、方法返回值,而非局部变量)
解决办法:利用public对外公布必须的方法,其他不做公布,
注意事项:降低耦合度需要慎重,具体情况中,适量即可,别为了符合最少知道原则,做很复杂的中介(或者说分层),早曾系统复杂/结构不够清晰。
6、开闭原则
定义:软件在升级维护等过程中,由于需要对软件的代码进行修改,这往往会对旧有代码引入错误,这样就要对整个功能进行重构,对原有代码都要进行测试。
解决办法:扩展为主,修改为辅,即就是抽象构建整体,实现扩展细节,扩展时通过派生一些类去实现,而非修改去实现。
注意事项:对抽象构建整体要求高,需要一定的前瞻性,
总结如下:
1. 单一职责 实现职责单一
2. 里氏替换 继承结构不可破坏
3. 依赖倒置 面向接口
4. 接口隔离 接口设计精简
5. 最少知道 类之间的耦合要低
6. 开闭原则 扩展可以,修改拒绝
- 设计模式--6个设计原则
- 《大话设计模式》读书笔记:6个原则
- [设计模式] 设计原则
- 设计模式 - 设计原则
- 设计模式 - 设计原则
- 设计模式设计原则
- 设计模式 - 设计原则
- 设计模式,设计原则
- 设计模式设计原则
- 设计模式-设计原则
- 设计模式-设计原则
- 设计模式--设计原则
- 设计模式的5个原则
- 设计模式--6大原则--开闭原则
- 设计模式6大原则:开闭原则
- 设计模式原则(6):迪米特原则
- 设计模式--6大原则--开闭原则
- 设计模式--6大原则--开闭原则
- PAT(乙级)1013
- 《大话数据结构》学习笔记--chapter 1
- Python-多进程
- jQuery操作DOM
- 通过Object.prototype.toString.call()--判断数据(基本、引用)类型
- 设计模式--6个设计原则
- jQuery写返回顶部练习
- 18. 4Sum
- 大数据统计租房市场现状(上海篇)
- shell编程——if语句 if -z -n -f -eq -ne -lt
- Caffe2 Tutorials Overview(一)
- NETGEAR WNDR3800 刷机支持ipv6 部署本地git服务器
- Java+Selenium3方法篇18-获取当前页的源码
- TCP建立/关闭连接时握手过程中的状态情况