您的位置:首页 > 其它

大话设计模式——六大原则

2016-02-03 16:20 253 查看
我们为什么要学习设计模式?

设计模式是面向对象技术的最新进展之一。由于面向对象设计的复杂性,所以我们都希望能做出应对变化,提高复用的设计方案,而设计模式就能帮助我们做到这样的结果。通过复用已经公认的设计,我们能够在解决问题时避免前人所犯的种种错误,可以从学习他人的经验中获益。显然设计模式有助于提高我们的思考层次。让我们能够站在巨人的肩膀上。

通过一个星期左右的时光,把大话设计模式这本书看完了。不禁拍案叫绝,这本书写的真棒!好了,废话不多说,在此,先简单说一下设计模式六原则。

我们首先来介绍开放-封闭原则,因为这是面向对象的核心所在。同时这也是六个原则中最抽象的一个。如果非要在这六个原则中找一个Boss的话,非它莫属。

(一)开放—封闭原则:

开闭原则,是说软件实体(类、模块、等)应该可以扩展,但是不可修改。也就是说这个原则有两个特征,一个是说对于扩展是开放的,另一个是说对于更改是封闭的。

我们在做系统开发的时候,都不要指望系统一开始需求就特别确定,并且不会再更改。这是不现实的想法。那么我们应该如何面对需求的改变呢?最好的办法就是多扩展,少修改。开放—封闭原则告诉我们,设计程序的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改,如果增加了新需求,我们只需添加一些类就能搞定,原来的代码尽量不动。即面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这便是开放-封闭原则的精神所在。

对类而言,绝对地不修改是不可能的。无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。也就是说在我们最初设计代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。需要注意的是,在开发过程中,开发人员应该仅对程序中频繁变化的那部分做出抽象。而不是对应用程序中的每个部分都刻意去进行抽象




(二)单一职责原则:

它的准确解释是,就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多。就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

(三)依赖倒转原则:

官方解释是抽象不应该依赖细节,细节应该依赖于抽象。高层模块不应该依赖低层模块。两个都应该依赖抽象。换句话说就是要针对接口编程,不要对实现编程。

如果PC里面CPU、内存、硬盘都需要依赖具体的主板,主板一坏,所有的部件就都没用了,这显然不合理的。反过来,如果内存坏了,也不应该造成其他部件不能用才对。而如果不管高层模块还是低层模块,他们都依赖于抽象,具体一点就是接口或抽象类,只要接口是稳定的,任何一个的更改都不用担心其他受到影响。

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




那么为什么依赖了抽象的接口或抽象类,就不怕更改了呢???这就需要引出下一个原则:里氏代换原则

(四)里氏代换:

一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别子类型必须能够替换掉他们的父类型。而正是这个原则使得继承复用成为了可能。






(五)迪米特法则:

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

它首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限。也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。(需要公开的字段通常用属性来体现,也恰恰体现了封装的思想。)迪米特法则的根本思想,是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个出在弱耦合的类被修改,不会对有关系的类造成波及。也就是说,信息的隐藏促进了软件的复用。

(六)合成/聚合复用原则:

合成(组合)和聚合都是关联的特殊种类。(这一点在UML类图中讲到过,此处不再赘述)。合成/聚合复用原则是尽量使用合成/聚合,尽量不要使用类继承。它的好处在于,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

为什么尽量不要使用类继承呢???继承是一种强耦合的结构。父类变,子类就必须要变。所有盲目使用继承就会造成不必要的麻烦。因此我们在使用继承时,一定要在是“is-a”的关系时再考虑使用,而不是任何时候都去使用。






最后说一下如何遵守这六个原则?对这六个原则的遵守并不是简单地是与否的问题。而是多与少的问题。任何事都是过犹不及,设计模式的六个原则同样也是如此。制定六个原则的目的并不是让我们刻意的去遵守他们,而是要根据实际情况去灵活运用。防止过度设计。对他们的遵守在一个范围内,就算是良好的设计。

最后写上大话设计模式作者讲述的设计模式四境界:

1、没学之前一点不懂,根本想不到用设计模式,设计的代码很糟糕。

2、学了设计模式后,很开心,于是到处想着用自己学过的模式,于是时常误用模式而不自知。

3、学完全部模式时,感觉诸多模式极其相似,无法分清模式之间的差异,有困惑,但深知误用之害,应用之时有所犹豫。

4、灵活应用模式,甚至不应用具体的某种模式也能设计出非常优秀的代码,以达到无剑胜有剑的境界。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: