大话设计模式:(六大原则)

设计模式六大原则分别是单一职责原则(SPR)、开放-封闭原则、里氏代换原则(LSP)、依赖倒转原则、迪米特原则(LoD)和合成/聚合复用原则(CARP)。

 

1.单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合导致的设计,当变化发生时,设计会遭受到意想不到的破坏。

软件设计真正要做的许多内容,就是如果发现职责并把那些职责相互分离。其实这个要去判断是否应该分离出类来,也不难,那就是如果能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责,就应该考虑类的职责分离。

整合当然是一种好的思想,但是当我们编程时,我们却是在类的职责分离上多思考,做到单一职责,这样我们的代码才是真正的易维护、易扩展、易复用、灵活多样。

 

2.开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。

这个原则其实有两个特点:一个是“对于扩展是开放的”;“对于更改是封闭的”。

在软件设计阶段,怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?开放-封闭原则给了我们答案。

无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生改变的种类,然后构造抽象来隔离那些变化,等到变化时立即采取行动。

在我们最初编程写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。

面对需求,对程序的改动是通过增加新代码来进行的,而不是更改现有的代码。

下面来举一个课本上的例子:编写一个运算方法程序,满足基本的运算。

 

上面就是这个例子的概况代码,若有新的功能需要加入,在代码中加入相应的类就可以了。

 

3.里氏代换原则,子类型必须能够替换掉它们的父类型。

一个软件实体如果使用的是一个父类的话,那么一定使用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里,把父类都替换成它的子类,程序的行为没有变化。

也正是因为有了这个原则,使得继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而对子类也能够在父类的基础上增加新的行为。比如说,猫是继承动物类的,以动物的身份拥有吃、喝、跑、叫等行为,可当某一天,我们需要狗、牛、羊也拥有类似的行为,由于它们都是继承于动物,所以除了更改实例化的地方,其它地方则不需要。

 

4.依赖倒转原则,A:高层模块不应该依赖底层模块。两个模块都应该依赖抽象。

                            B:抽象不应该依赖细节,细节应该依赖抽象。

原话解释是抽象不应该依赖细节,细节应该依赖抽象。说白了,就是针对接口编程,不要对实现编程。

依赖倒转原则其实可以说是面向对象设计的标志,用哪种语言编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止与抽象类或者接口,那就是面相对象的设计,反之就是面向过程化的设计了。

 

5.迪米特法则,也叫最少知识原则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限。

其根本思想是强调了类之间的松耦合,解耦---才是它们最为重要的应用,这也是所有原则的根本。类之间的耦合越低,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。

 

6.合成/聚合复用原则,尽量使用合成/聚合,尽量不要使用类的继承。

合成(也翻译成组合)和聚合都是关联的特殊种类。聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的“拥有”关系,体现了严格的部分和整体 的关系,部分和整体的生命周期一样。比如说,大雁有两个翅膀,翅膀与大雁是部分和整体的关系,并且他们的生命周期是相同的,于是大雁和翅膀就是合成关系。而大雁是群居动物,所以每只大雁都是属于一个雁群,一个雁群可以有多只大雁,所以大雁和雁群是聚合关系。

合成/聚合原则的好处就是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

 

PS: 学习小结:

       在进行设计模式的学习的时候,总是感觉这是一种让我们更好的进行软件设计的模式,而正是这些模式的存在才使得我们的软件结构以更好的形式存在,而且可复用性和灵活性都很强。

      这部分的知识,但从课本上来学习,效果不是很大,还是要不断地在实践中不断地去练习使用,才能更加灵活的使用这些模式,以编出更好的软件。

时间: 2024-10-28 20:24:58

大话设计模式:(六大原则)的相关文章

设计模式六大原则(6):开闭原则

定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化.          开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统.开闭原则可能是设计模式六项原则中定义最模糊的一个了,它

设计模式六大原则 里氏替换原则

设计模式六大原则(2):里氏替换原则 是不是有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 2002年,软件工程大师Robert C. Martin,出版了一本<Agile Software Development Principles Patterns and Practices>,在文中他把里氏代换原则最终简化为一句话: "Subtypes must b

设计模式六大原则 依赖倒置原则

设计模式六大原则(3): 依赖倒置原则 定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 所谓依赖倒置原则(Dependence Inversion Principle )就是要依赖于抽象,不要依赖于具体.简单的说就是对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合. 依赖倒置原则的核心思想是面向接口编程. 而面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变化时,上层也要跟着变化,这就会导致模块的复用性降低而且大大提高

java设计模式六大原则之场景应用分析

看了一篇文章,感觉收获蛮大,不过还有一些不懂,收藏慢慢研究. 面对项目中如此众多的设计模式,我们有时候无法下手.在强大的设计框架也终脱离不了23种设计模式,6大原则.我们只要把内功修炼好,掌握其精髓也离我们不远了...     目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大原则(6):开闭原则 设计模式六大原则(1):单一职责原则 设计

设计模式六大原则 单一职责原则

设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责,一个人只负责做一件事. ( 一个类,只有一个引起它变化的原因.应该只有一个职责.每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起.这会导致脆弱的设计.当一个职责发生变化时,可能会影响其它的职责.另外,多个职责耦合在一起,会影响复用性.例如:要实现逻辑和界面的分离 ) 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修

设计模式六大原则——合成/聚合复用原则(CARP)

   1.定义    简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承.           2.释义     为什么"要尽量使用合成和聚合,尽量不要使用继承"呢?      这是因为:      第一,继承复用破坏包装,它把父类的实现细节直接暴露给了子类,这违背了信息隐藏的原则:      第二:如果父类发生了改变,那么子类也要发生相应的改变,这就直接导致了类与类之间的高耦合,不利于类的扩展.复用.维护等,也带来了系统僵硬和脆弱的设计.而用合成和聚合

PHP设计模式——六大原则

      声明:本系列博客参考资料<大话设计模式>,作者程杰.      一般认为遵从以下六大原则的代码是易扩展可复用的代码:                                        这六大原则任何面向对象的语言都应该遵守的,要想让你的代码易扩展高服用就尽量去满足这六大原则吧,不一定严格按照某种设计模式,但是如果你的代码符合这六大原则,那么你的代码就是好代码了,好的代码不一定是严格按照设计模式写的代码.          1.单一职责         定义:不要存在多于

一句话评论设计模式六大原则

原文链接:http://www.cnblogs.com/lancidie/archive/2012/02/03/2337168.html        原则,故名思议则是本质的意思.所谓擒贼先擒王,研究设计模式自然要先了解设计原则,所有的模式都是在这些原则的基础之上发展起来的,有的是侧重一个,有的是多个都有所涉及.看完设计模式之后,我感觉到每个模式都有这些原则的影子,还渗透着面向对象的三大属性,也觉得这些原则也都有相通之处,,正是有了他们才使我们由代码工人转为艺术家.下面我来点评一下六大原则,望

【转载】设计模式六大原则(1):单一职责原则

定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 解决方案:遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P2功能.这样,当修改类T1时,不会使职责P2发生故障风险:同理,当修改T2时,也不会使职责P1发生故障风险.          说到单一职责原则,很多人都会不屑一顾.因为它太简单了.稍

设计模式六大原则——开放封闭原则(OCP)

      什么是开闭原则?       定义:是说软件实体(类.模块.函数等等)应该可以扩展,但是不可修改.       开闭原则主要体现在两个方面:       1.对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况.     2.对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改.         怎么使用开闭原则?     实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定.让类依赖于固定的抽象,所以对修改就是封闭的:而