本笔记摘抄自:http://www.javashuo.com/article/p-qcqmitdp-hn.html,记录一下学习过程以备后续查用。html
写代码也是有原则的,咱们之因此使用设计模式,主要是为了适应变化,提升代码复用率,使软件更具备可维护性和可扩展性。若是咱们能更好的理编程
解这些设计原则,对咱们理解面向对象的设计模式也是有帮助的,由于这些模式的产生是基于这些原则的。设计模式
设计原则包括:单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、接口隔离原则(ISP)、合成复用原学习
则(CRP)、迪米特法则(LoD)。编码
下面咱们就分别介绍这七种设计原则:设计
1、单一职责原则(SRP)htm
1)SRP(Single Responsibilities Principle)的定义:就一个类而言,应该仅有一个引发它变化的缘由。简而言之,就是功能要单一。对象
2)若是一个类承担的职责过多,就等于把这些职责耦合在一块儿,一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力。这种耦合会致使blog
脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。(敏捷软件开发)继承
3)软件设计真正要作的许多内容,就是发现职责并把那些职责相互分离。
小结:单一职责原则(SRP)能够看作是低耦合、高内聚在面向对象原则上的引伸,将职责定义为引发变化的缘由,以提升内聚性来减小引发变化的
缘由。责任过多,引发它变化的缘由就越多,这样就会致使职责依赖,大大损伤其内聚性和耦合度。
2、开闭原则(OCP)
1)OCP(Open-Close Principle)的定义:就是说软件实体(类、方法等等)应该能够扩展(扩展能够理解为增长),可是不能在原来的方法或者类上修
改,也能够这样说,对增长代码开放,对修改代码关闭。
2)OCP的两个特征: 对于扩展(增长)是开放的,由于它不影响原来的,这是新增长的。对于修改是封闭的,若是老是修改,逻辑会愈来愈复杂。
小结:开闭原则(OCP)是面向对象设计的核心思想。遵循这个原则能够为咱们面向对象的设计带来巨大的好处:可维护(维护成本小、作管理简
单、影响最小)、可扩展(有新需求,增长就好)、可复用(不耦合,可使用之前代码)、灵活性好(维护方便、简单)。开发人员应该仅对程序中
出现频繁变化的那些部分作出抽象(可是不能过激,对应用程序中的每一个部分都刻意地进行抽象一样也不是一个好主意,拒毫不成熟的抽象和抽象自己
同样重要)。
3、里氏替换原则(LSP)
1)LSP(Liskov Substitution Principle)的定义:子类型必须可以替换掉它们的父类型。更直白的说,LSP是实现面向接口编程的基础。
小结:任何基类能够出现的地方,子类必定能够出现,因此咱们能够实现面向接口编程。 LSP是继承复用的基石,只有当子类能够替换掉基类,软件
的功能不受到影响时,基类才能真正被复用,而子类也可以在基类的基础上增长新的行为。里氏代换原则是对开闭原则的补充,实现开闭原则的关键步
骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,因此里氏代换原则是对实现抽象化的具体步骤的规范。
里氏替换原则的经典反例:正方形不是长方形、玩具枪不能杀人、鸵鸟不会飞。
4、依赖倒置原则(DIP)
1)DIP(Dependence Inversion Principle)的定义:抽象不该该依赖细节,细节应该依赖于抽象。简单说就是,咱们要针对接口编程,而不要针对实现
编程。
2)高层模块不该该依赖低层模块,两个都应该依赖抽象,由于抽象是稳定的。抽象不该该依赖具体(细节),具体(细节)应该依赖抽象。
小结:依赖倒置原则其实能够说是面向对象设计的标志,若是在咱们编码的时候考虑的是面向接口编程,而不是简单的功能实现,体现了抽象的稳定
性,只有这样才符合面向对象的设计。
5、接口隔离原则(ISP)
1)接口隔离原则(Interface Segregation Principle, ISP)指的是使用多个专门的接口比使用单一的总接口要好。也就是说不要让一个单一的接口承担
过多的职责,而应把每一个职责分离到多个专门的接口中,进行接口分离,过于臃肿的接口是对接口的一种污染。
2)使用多个专门的接口比使用单一的总接口要好。
3)一个类对另一个类的依赖性应当是创建在最小的接口上的。
4)一个接口表明一个角色,不该当将不一样的角色都交给一个接口。没有关系的接口合并在一块儿,造成一个臃肿的大接口,这是对角色和接口的污染。
5)“不该该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们
不用的方法,若是强迫用户使用它们不使用的方法,那么这些客户就会面临因为这些不使用的方法的改变所带来的改变。
小结:接口隔离原则(ISP)告诉咱们,在作接口设计的时候,要尽可能设计的接口功能单一,功能单一,使它变化的因素就少,这样就更稳定。其实这
体现了高内聚、低耦合的原则,这样作也避免接口的污染。
6、合成复用原则(CRP)
1)组合复用原则(Composite Reuse Principle, CRP)就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象经过向这些
对象的委派达到复用已用功能的目的。简单地说,就是要尽可能使用合成/聚合,尽可能不要使用继承。
2)要使用好组合复用原则,首先须要区分”Has--A”和“Is--A”的关系。“Is--A”是指一个类是另外一个类的“一种”,是属于的关系,而“Has--A”则不一样,它表
示某一个角色具备某一项责任。致使错误的使用继承而不是聚合的常见的缘由是错误地把“Has--A”当成“Is--A”。例如:鸡是动物,这就是“Is-A”的表现,
某人有一支手枪,People类型里面包含一个Gun类型,这就是“Has-A”的表现。
小结:合成复用原则可使系统更加灵活,类与类之间的耦合度下降,一个类的变化对其余类形成的影响相对较少,所以通常首选使用合成来实现复
用;其次才考虑继承,在使用继承时,须要严格遵循里氏替换原则,有效使用继承会有助于对问题的理解,下降复杂度,而滥用继承反而会增长系统构
建和维护的难度以及系统的复杂度,所以须要慎重使用继承复用。
7、迪米特法则(Law of Demeter)
1)迪米特法则(Law of Demeter,LoD)又叫最少知识原则(Least Knowledge Principle,LKP),指的是一个对象应当对其余对象有尽量少的了
解。也就是说,一个模块或对象应尽可能少的与其余实体之间发生相互做用,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,
扩展起来更加容易。
2)关于迪米特法则其余的一些表述有:只与你直接的朋友们通讯,不要跟“陌生人”说话。
3)外观模式(Facade Pattern)和中介者模式(Mediator Pattern)就使用了迪米特法则。
小结:迪米特法则的初衷是下降类之间的耦合,实现类型之间的高内聚、低耦合,这样能够解耦。可是凡事都有度,过度的使用迪米特原则,会产生
大量这样的中介和传递类,致使系统复杂度变大。因此在采用迪米特法则时要反复权衡,既作到结构清晰,又要高内聚低耦合。