Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1411184
  • 博文数量: 241
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2253
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:27
个人简介

--

文章分类

全部博文(241)

文章存档

2021年(3)

2019年(6)

2018年(1)

2017年(9)

2016年(21)

2015年(50)

2014年(125)

2013年(26)

我的朋友

分类: C/C++

2014-02-25 13:48:56

在学习23种常用的设计模式之前,我们必须了解设计模式中的六大设计原则,即我们常说的SOLID原则,因为它们是学习设计模式的基础,在设计模式中或多或少会使用到其中的设计原则,了解这当中的道理将有助于我们理解常用的设计模式。

单一职责原则,SRP(Single Responsibility Principle)

定义:就一个类而言,应该仅有一个引起它变化的原因。

解析:从定义来看,理解起来应该不困难,通俗点地说就是不存在多个原因使得一个类发生变化,也就是说一个类只负责一种职责工作,该原则是六大原则中最简单的一种,因此不必多说。

优点:让一个类只负责一种职责的好处有如下几种

(1)类的复杂度降低,一个类只负责一个功能

(2)可读性增强,复杂度降低,阅读起来自然轻松

(3)可维护性强,一个易读、简单的类当然也易维护                                                             

开放-关闭原则,OCP(Open-Close Principle)

定义:一个软件实体(如类、模块、函数)应当对扩展开放,对修改关闭。

解析:该定义理解起来略微抽象,按照自己的理解就是,对于一个已经存在的类,如果我们需要继续去扩充其功能,不应该直接修改该类的内部实现,而是应该通过抽象类或者接口来进行功能的扩充,由此可见,实现开闭原则关键是抽象。至于为什么需要开闭原则,我们可以假想,一个网络游戏若需要更新,我们常做的方法是为该游戏打上一个补丁,或者是更新它仅需更新的模块,而不会把整个游戏卸载,然后再重新装上新版本的游戏。

优点:

(1)具有灵活性,通过拓展一个功能模块即可实现功能的扩充,不需修改内部代码。

(2)具有稳定性,表现在其基本功能类不允许被修改,使得被破坏的程度大大下降。

氏替换原则,LSP(Liskov Substitution Principle)

定义:里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名所命名。

定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都替换成o2时,程序的行为不发生任何变化,那么T2为T1的子类。

定义2:所有引用父类的地方都必须能够透明地使用子类对象。

解析:其实两个定义所表达的意思都相同,大概是说,就是在所有父类出现的地方,子类都可以出现,并且将父类对象替换为子类对象的时候,程序不会抛出任何异常或者错误,因此我们需要注意的是,尽量不要重载或者重写父类的方法(抽象方法除外),因为这样可能会改变父类原有的行为。

由上可见,子类在扩展父类的功能时,重写了父类方法,导致了程序结果的错误。因此,对于里氏替换原则的更通俗的说法就是,子类可以扩展父类的功能,但不改变父类原有的功能。

优点:可扩展性与可维护性强

接口隔离原则,ISP(Interface Segregation Principle)

定义:一个类对另一个类的依赖应该建立在最小的接口上。

解析:一个接口代表一个角色,不应该将不同的角色都交给一个接口,这样会导致形成一个臃肿的大接口。听起来好像有些像单一职责原则,但是不尽然,在单一职责原则中,一个接口可能有多个方法,提供给多种不同的调用者所调用,但是它们始终完成同一种功能,因此它们符合单一原则,却不符合接口隔离原则,因为这个接口存在着多种角色,因此可以拆分成更多的子接口,以供不同的调用者所调用。

优点:符合高内聚低耦合的设计思想,意在设计一个短而小的接口和类,这个在代码重构中比较常见,可读性、可扩展性、可维护性等都不错,很受程序员们的欢迎。

依赖倒置原则,DIP(Dependence Inversion Principle)

定义:抽象不应该依赖于细节,细节依赖于抽象。

解析:依赖倒置原则在程序编码中很常运用,其中心思想就是面向接口编程,高层模块不应该依赖底层模块(原子操作的模块),两者都应该依赖于抽象。接触过Spring框架的朋友都知道,Spring框架就是一个很好的依赖倒置原则思想的体现。

优点:还是那句,代码结构清晰,维护起来容易..哎,我都不想说了

最少知识原则,LKP(Least Knowledge Principle),又称迪米特法则,LOD(Law Of Demeter)

定义:一个对象应该对其他对象有最少的了解。

解析:意思就是一个对象对其他对象知道得越少越好,其核心就是低耦合。迪米特法则又有一个解释,即是只与直接的朋友通信,何谓直接朋友?大家都知道,对象之间的交流必定是少不了耦合的,为了降低对象之间的耦合,我们可以设定一个中间者,让这个中间者给要通信的双方进行传话,这样的话,这两个对象耦合程度可以达到很小,而我所说的这个中间者,就是直接朋友。

优点:我们可以试想一下,两个对象之间的耦合越大,其维护起来就越是困难,假如我们需要改变其中一个对象,另外一个对象也要进行大量的修改,而迪米特法则,则让对象之间的耦合降到最小,符合高内聚低耦合的特性,这样维护起来当然就容易多咯~

阅读(1195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~