浅析《大话设计模式》六大原则

   《大话设计模式》这本书以面向对象编程思想为基准,通过23个具体模式以及6大编程原则,生动的启迪了我这个菜鸟中的菜鸟级别的程序员,让我对于面向对象的思想有了境界上的提高,我将它奉若神明般的对待,这次就对这6大原则进行总结。

    与其说是6大设计原则,我更加觉得该把它称为是面向对象编程的6大思想准则,将各个模式比做成是武林各派的必杀技的同时,这6大思想则是统一天下武林的《易筋经》,Because在任何一种模式中,无一例外这6大思想至少能体现出一种,多则3~4种,下面就简单的对其进行分析。

        

单一职责原则(SRP

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

   理解:书中例子从手机功能过多但是具体功能不够强大为例引出该原则,根据定义,我的理解就是在单个窗体或者类中定义的职责过多从而导致与其他的类耦合性太强,就像是传统的收音机那样,把内部结构集中化,一个小小的电容器坏掉,整个电路板就歇菜。

    But,我查了一个资料,她说“只有逻辑足够简单,才可以在代码级别上违反单一职责原则;只有类中方法数量足够少,才可以在方法级别上违反单一职责原则;”也就是说只要在设计过程中逻辑、方法足够简单,适当的违反该原则也是可以的,因为这样带给你的代码量比较小,总而言之各有利弊,用代码做到心中有数。

 

开放封闭原则:

        定义:软件实体(类、模块、函数等等)应该扩展,但是不能修改。

   理解:结合到生活中,弹性上班工作制就将这一原则展现的很好,在保证不违反大原则的情况下,允许特殊情况特殊对待,而具体到代码中,就像“简单工厂模式”中计算器的例子,起初计划只能计算加减乘除,但是要加开放、平方运算后,修改源代码固然可以,但是从“可维护、灵活度高”的角度来分析又不太合理,So,具体原则:抽象一个运算类,把加、减、乘、除写成运算类的派生类,这样及时要增加新的运算法则,只需要新增加具体算法类就ok,我觉得这就是开放封闭原则在代码中最基本的体现,即减少了对以往代码修改而带来的风险。

   当然,这个原则在6大原则中的地位我觉得能够排到第一第二吧,面向对象三大特性封装、继承、多态都能与其建立联系从而连接到可复用、维护、扩展……

 

依赖倒转原则:

         定义:1、高层模块不该依赖低层模块,两个都该依赖抽象。

         2、抽象不应该依赖细节,细节应该依赖抽象。

   理解:这一点在《建造者模式》中得到了淋漓尽致的应用,小菜和大鸟吃炒饼的过程之所以两个人口感不同,所吃的菜都依赖于厨师这个细节,该原则提倡高低层模块全部依赖于抽象,何为抽象?麦当劳肯德基流水线的生成过程就是抽象,当然在开放封闭模式中就提到对具体加减乘除的抽象,但是我通过敲代码的思考,抽象的角度以及抽象的度是一个很难把控的问题,至少这个阶段,对一个具体的问题,抽象的概念是有,但是具体抽象类应该具有哪些方法、是什么类型,还是很难的。

   其实归根到底,还是解高层和底层模块耦合的本质。

里氏代换原则(LSP):

         定义:子类型必须能够替换掉他们的父类型。

   理解:起初对于里氏代换的原则理解很浅显,认为这个原则其实是在说这是实现代码意义上继承的前提,懂了这个规则才能实现继承、实现代码复用,其实我想说这个原则的“水很深”,在书中23个模式的讲解中,里氏代换原则的概念很少有提,这也让它更加神秘,但是有一点,假如我非要不遵循里氏替换原则会有什么后果?后果就是:你写的代码出问题的几率将会大大增加。告诫我自己,多查资料,慢慢都能学懂。

 

迪米特法则:

       定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果是其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

   理解:类与类之间建立联系,尽量不是类与具体的方法之间建立联系,就像小菜去找维修部们,小张小王互相推脱,三个和尚难吃水,主要还是强调类之间的松耦合。

 

接口隔离原则

       定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

   理解:由于在C#中学习过在抽象的类中所写的抽象方法在具体的派生类中都需要重写,So,要求我们对接口的设计尽量考虑到派生类方法的重写上,不能因为类与类之间依赖经过接口就得将多余其方法进行重写,That is all.

                                                                    浅析《大话设计模式》六大原则_第1张图片

总结:

         这六大法则,不仅仅需要了解,更要是用在编程中,我觉得最近这段时间我也是醉了,一直在生活中找能体现这6大原则的例子,今天掏出钱包,发现银行卡、图书证、零钱都在里面,竟然随口说了声“这耦合也忒强了吧”~~我也是醉了,不过面向对象的思想我认为就得这样不断去体会,经过这样以后编出来的代码才能更具复用性、维护性、灵活性。

    这个总结未结合代码,仅仅是对6中关系的梳理,以后的博客中再来体现啦。


你可能感兴趣的:(【设计模式】)