设计模式之-----六大原则

设计模式中,有六大经典的原则,以下是本人在学习过程中总结的,学习过程中参考了《大话设计模式》这本书,以下为个人见解,如有不当,请大家指出。以便帮助后学习的朋友更简单的理解和学习。

1、单一职责原则(Single Responsibility Principle)

    顾名思义,单一职责,就是让系统中的每个类都有自己的事情,不要“乱掺和”,一个类,只做一件事情,只让一个“事件”来驱动,例如:生产一台电风扇,电风扇有很多零件组成,扇叶,电动机,螺丝。。。等等,这个时候,如果一个类承担了所有的工作,既要生产电动机,又要做扇叶,麻烦不说,工作量和日后的维护都是个大问题,所以,就要把这些大的功能细化,分为小功能,制定好统一的标准后,让每个类只做一个功能,

例如,一个电风扇需要电压为220v的电动机,一个类只负责生产电动机,其他的一律不管,别的零件“爱怎样就怎样”,我只负责生产,生产完之后,谁去用,怎么用,都不是这个类考虑的问题,这样,将问题细化,类的职责单一之后,日后维护起来就容易了许多。判断一个类是否是单一职责很简单:如果你能想到多于一个原因去改变这个类,那么这个类就不是单一职责的

例如:上面写的,生产电动机的类,表面上看,这个类中生产电动机,别的都不管,看上去好像的单一职责的,但是你写完之后,再去想一下,有什么变动会让我去改动这个类,来适应这个变动呢?随便想一下,假如我的额定电压该成100v了,这个类是不是要改?假如我想让这个电动机有档位的功能,这个类是不是要改?假如我的电动机想变成大一号的,这个类是不是要改?等等。。。那么,这个类的改动的原因,不止一个,那这个类就不是单一职责的。所以,这个类的功能,还要再次细化,细化到只有一个变动的原因才能驱使你改变这个类为止。上边的电动机,分解为各个小的部件,例如一个类专门生产电压适应器,只有我改变电压的时候,才需要对这个类做出改变,其他的,电动机增加档位,改变电动机大小,都与这个类无关,那么,这个类就是单一职责的。

2、开-闭原则(Open Close Principle)

    开闭原则,即对扩展开放,对修改关闭。这个原则大体的意思就是,当一个系统完成时,面对新增的需求,要做的是在原有基础上增加,而不是在原有基础上修改

还是用上面的例子,假如我的电风扇生产好了,一开始用的挺好的,但是后来,我想在电风扇地下加几个轮子,怎么办?难道我要把电风扇拆开,去买个带轮子的底座,在重新安上么?这未免太复杂了,而且万一底座上有什么电路的话,换起来就更麻烦了。最好的解决办法是,买几个轮子,直接安装到底座上,这样,不用再拆开风扇,也能实现我的这个新的要求,但是现在就有一个问题,安装轮子的时候,要求底座上要有螺丝孔,否则还是没办法安装,这就要求我们的设计人员,在设计的时候,尽可能的留出这些扩展的位置,以便以后扩展使用,当新增一个需求时,能很快的完成这个需求但是还能做到尽少改变之前的方法,那么就做到了“开闭原则”。

3、里氏代换原则(Liskov Substitution Principle)

    里氏代换原则,说的通俗点,就是子类可以代替父类的位置,而这个过程,系统不会感觉到差异。具体一点的话,就是子类必须实现父类的方法,重写父类方法;(注意重写和重载的区别)。

举个例子来讲,有一个父亲类,父亲会伐木,他有一个儿子,儿子类继承了父亲类的伐木方法,并且将它重写(可以理解为父亲用斧子砍树,儿子用电锯砍树,最终的结果都是砍树,只不过这个过程不一样),并且他的儿子还有一个唱歌的方法,这是他的父亲不具备的。一天,一个农场主想找父亲帮忙砍树,但是父亲生病了,不能去,于是就派儿子去了,儿子到了那里,砍完了树,拿了工钱回家了,这个农场主并没有感觉到有什么奇怪,因为他的目的是找人把树砍了,具体是儿子砍得还是父亲砍得,对农场主来说是没有区别的。这个时候,儿子类能在任何时候代替父亲类的位置,而且别人并不会发现有什么不一样。这里他们就遵循了里氏代换原则。

由于子类型的可替换性,使得使用父类类型的模块在无需修改的情况下就可以进行扩展。也即,子类必须能够代替掉他们的父类类型


4、依赖倒转原则(Dependence Inversion Principle)

    高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象,抽象不应该依赖于具体,具体应该依赖于抽象。这是依赖倒转原则的官方解释,不太好理解。通俗点说,就是要针对接口编程,不要针对具体实现去编程,让应用程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。我开始学习的时候也是晕头转向的,这些词说的都太宽泛了,下边用一个具体的例子来说明一下。

就拿我们在每天都能接触到的电脑来说,大家都知道,电脑是由主板,cpu,内存条,显卡等原件组成的,我们从来都没有听说过内存条坏了要把主板也一起换了,我们只需要买一个新的内存条换了就ok了,这是为什么呢?电脑不应该是一个十分精密的仪器么,为什么随便买来一个内存条插上就能用了呢?大家都知道,内存条有一个叫做“金手指”的东西,而且不管哪一个内存条,他们的金手指部分张的都是一样的,也就是说,电脑的主板厂商和内存厂商有这样一个协议,那就是,每个内存上都有一个金手指,而主板上都有让金手指插拔的地方,这样一来,双方都依赖于这个“金手指”了,而不是具体的某块内存,至于内存中是什么样的原理,如何运作,主板并不关心,主板要做的就是从金手指上读取数据,(注意,主板读取的地方是“金手指”,而不是具体的某一个内存),同样的,主板是什么原理,内部如何运作,内存也不关心,内存要做的只是往金手指上输出数据,至于有没有人读,谁来读,都不是内存所关心的。这样内存和主板都不依赖于对方,那么,只要有“金手指”的地方,内存和主板就都可以正常的运作了。依赖倒转原则大致就是这个意思。


5、迪米特法则(Low Of Demeter)

    迪米特法则,也叫最少知识原则。这个原则的核心就是“不和陌生人说话”,通俗的来讲,就是一个类,对于与自己相耦合的类来说,知道的越少越好。

举个例子来说,小张是公司行政部的员工,一天,他的电脑坏了,不得已要麻烦技术部的人来解决,可是他不认识里边的员工,没有人会来帮他,这个时候,如果他认识技术部的经理,那么技术部经理就可以找他手下的人来帮助小张解决问题了。

在上边的例子中,技术部是一个抽象的概念,哪怕技术部的员工内部全都换成了新人,只要小张认识这个技术部的经理,那么谁帮他修电脑,最后结果都是一样的。而不必费尽心思去认识技术部的员工了。

规范一点的话,就是,如果两个类之间不必进行直接通信,那么这两个类就不应当直接发生耦合,如果一个类血药调用另一个类的方法的话,可以通过第三者来转发这个调用

6、接口隔离原则(Interface Segregation Principle)

    接口隔离原则的核心精神是:尽量使用多个专门的单一的小接口,避免庞大的总接口;专业点的说法是类间的依赖关系尽量建立在最小的接口上。接口尽量的小,但是小不是说一个接口一个方法,小也要不违背单一职责原则。接口隔离强调接口的单一性,不要将一大堆接口暴露在用户面前,那样会造成严重的接口污染,具体的接口小的程度,还需要在以后的实践中才能更深刻的理解出来。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值