大学学习的是计算机科学技术专业。 但是真正从事软件方面的工作也不过是近一年的事情。前两年有点不务正业了哈。
在读大学时期就想着认证学习设计模式的,但是那时候读了是似是而非 ,一头的雾水,想着生硬的啃着那本GOF的经典模式,最终无功而返,收获不大。最近想着卷土重来,并写一系列的文章,全当做是学习笔记了
(在文章中,很多东西都是看到别人的东西搬过来的,非常感谢原作者的辛劳与智慧)
本系列文章初步规划 共有24篇分别讲解GOF的23设计模式。开篇为总论,讲解设计模式的遵循的一些基本的原则。
面向对象的一些基本的原则
- SRP----单一职责原则
- OCP----开放封闭原则
- LSP----里氏替换原则
- DIP----依赖倒置原则
- ISP-----接口隔离原则
下面我就分别做一些介绍。
SRP(single responsibility principle)
The single responsibility principle states that every object should have a single responsibility,and that responsibility should be entirely encapsulated by the class.All its services should be narrowly aligned with that responsibility.
单一职责原则 其实质就是要求每个类应该只能有一原因引起它的变化。为什么要有单一职责原则呢?
我们来假设有那么一个类有很多个功能。访问数据库可以找他,访问注册表可以用它,网络通信可以找他。那客户程序可就幸福了,因为需要什么都可以找他完成。
如果存在这么一个类,他能是稳定的吗?几乎不可能稳定。影响他的因素太多了,因此他可能常常要被修改,变的很不稳定。
ps:在这里考虑一下,如果一个类经常被修改。。。鬼知道他会不会对调用这个类的其他客户程序造成什么样影响。 实际项目中要把握好单一职责中单一的度。太过单一的话,违背了面向对象设计中的封装原则。过犹不及。
LSP and DIP
LSP-----Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.
DIP-----The principle states:
A.High-level modules should not depend on low-level modules.Both should depend on abstractions
B.Abstractions should not depend upon details.Details should be depend upon abstractions.
在里氏替换原则和依赖倒置原则中,接口代表抽象的内容,子类相对具体,而且子类更倾向于发生变化,各类设计模式都在贯彻这两个原则,务求是客户程序依赖于抽象而非具体。
乍一看这两个原则很相似,他们有什么区别呢?
关键在于这两个原则站的角度不同。其中里氏替换 原则更多的是站在模式对象这一方,而依赖倒置原则更多的是站在客户程序这一方。模式对象这一方将相对多变的子类视同它的接口(或父类),而客户程序依赖的内容不是“相对多变的”子类,而是相对稳定的接口。
ISP
ISP----No Client should be forced to depend on methods it does not use.
接口隔离原则要求客户程序无须被迫依赖于他用不到的方法
软件设计是一个耗时的工作,但实际项目中我们常常会因为深思熟虑过头而在某些接口上画蛇添足,这样的接口被称为“Fat Interface”==肥胖臃肿超标 的接口。
PS:很多情况下接口隔离原则与前面的单一职责原则是相辅相成的,如果每个接口只定义“单一职责”,一般不容易出现Fat Interface,而且冗余比较少。但是单一职责原则并不保证客户程序只知道必要的,甚至有些情况下接口隔离原则与单一职责原则会出现一定程度上的冲突。设计时候需要根据用户界面、性能等因素权衡。
LoD:Law of Demeter、LKP
LoD/LKP-------
A.Each unit should have only limited knowledge about other units:only units "closely" related to the current unit.
B.Each unit should only talk to its friends;don't talk to strangers.
C.Only talk to your immediate friends
只和你的密友交谈。迪米特法则还有另外两层意思,就是调用者对于目标对象的知识最少,而且不和陌生人交谈。
OCP
OCP---Closed for Modification;Open for Extension.
开闭原则可以说是前面一系列原则的集大成者,内容更加高屋建瓴。
面向对象设计已经发生并将继续发生各种原则,除了熟悉他们外,更重要的是谨记他们的只是思路而且只是技术层面的思路,我们开发软件的主要目的是满足用户的需要,同时获得收益。因此面向对象原则还要和团队的承受能力,投入。时间进度等结合起来考虑。设计原则要活用!