1 概述编程
本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、合成/聚合复用原则、迪米特法则。设计模式
2 七大OO面向对象设计多线程
2.1 单一职责原则SRP(Simple Responsibility Principle)架构
单一职责原则,就是一个设计元素只作一件事。什么是“只作一件事”?就是少管闲事。现实中也是如此,若是让一我的认真的去作一件事,那么任何人都有信心能够作到很出色。就一个类而言,应该仅有一个引发它变化的缘由,若是你能想到两个或是多个动机去改变一个类,那么这个类就具备两个或是多个职责。应该把多余的职责分离出去,分别在建立一个类去完成每个职责。并发
2.2 开闭原则OCP(Open Close Principle)ide
很简单,一句话:“Closedfor Modification;Open for Extension",意思是,”对变动关闭;对扩展开放“。开闭原则的动机很简单:软件是变化的。一个软件实体应当对修改关闭,对扩展开放。也就是说,在设计一个模块的时候,应当对这个模块能够在不被修改的前提下被扩展。换言之,应当能够在没必要修改源代码的状况下改变这个模块的行为,在保持系统必定稳定性的基础上,对系统进行扩展。这是面向对象设计(OOD)的基石,也是最重要的原则。OCP说明了软件设计应该尽量地是架构稳定而又容易知足不一样的需求。工具
2.3 里氏替换原则LSP(Liskov Substitution Principle)post
a.由BarbarLiskov(芭芭拉.里氏)提出,是继承复用的基石。
b.严格表达:若是每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的全部程序P在全部的对象o1都代换称o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型.换言之,一个软件实体若是使用的是一个基类的话,那么必定适用于其子类,并且它根本不能察觉出基类对象和子类对象的区别.只有衍生类能够替换基类,软件单位的功能才能不受影响,基类才能真正被复用,而衍生类也可以在基类的基础上增长新功能。
c.反过来的代换不成立
d.<墨子.小取>中说:"白马,马也; 乘白马,乘马也.骊马(黑马),马也;乘骊马,乘马也."
e.该类西方著名的例程为:正方形是不是长方形的子类(答案是"否")。相似的还有椭圆和圆的关系。
f.应当尽可能从抽象类继承,而不从具体类继承,通常而言,若是有两个具体类A,B有继承关系,那么一个最简单的修改方案是创建一个抽象类C,而后让类A和B成为抽象类C的子类.即若是有一个由继承关系造成的登记结构的话,那么在等级结构的树形图上面全部的树叶节点都应当是具体类;而全部的树枝节点都应当是抽象类或者接口.
g."基于契约设计(DesignBy Constract),简称DBC"这项技术对LISKOV代换原则提供了支持.该项技术BertrandMeyer伯特兰作过详细的介绍:
使用DBC,类的编写者显式地规定针对该类的契约.客户代码的编写者能够经过该契约获悉能够依赖的行为方式.契约是经过每一个方法声明的前置条件(preconditions)和后置条件(postconditions)来指定的.要使一个方法得以执行,前置条件必须为真.执行完毕后,该方法要保证后置条件为真.就是说,在从新声明派生类中的例程(routine)时,只能使用相等或者更弱的前置条件来替换原始的前置条件,只能使用相等或者更强的后置条件来替换原始的后置条件.学习
2.4 依赖倒置原则DIP(Dependency Inversion Principle)网站
a.表述:抽象不该当依赖于细节,细节应当依赖于抽象.(Programto an interface, not an implementaction)
b.表述二:针对接口编程的意思是说,应当使用接口和抽象类进行变量的类型声明,参量的类型声明,方法的返还类型声明,以及数据类型的转换等.不要针对实现编程的意思就是说,不该当使用具体类进行变量的类型声明,参量类型声明,方法的返还类型声明,以及数据类型的转换等.
要保证作到这一点,一个具体的类应等只实现接口和抽象类中声明过的方法,而不该当给出多余的方法.
只要一个被引用的对象存在抽象类型,就应当在任何引用此对象的地方使用抽象类型,包括参量的类型声明,方法返还类型的声明,属性变量的类型声明等.
c.接口与抽象的区别就在于抽象类能够提供某些方法的部分实现,而接口则不能够,这也大概是抽象类惟一的优势.若是向一个抽象类加入一个新的具体方法,那么全部的子类型一会儿就都获得获得了这个新的具体方法,而接口作不到这一点.若是向一个接口加入了一个新的方法的话,全部实现这个接口的类就所有不能经过编译了,由于它们都没有实现这个新声明的方法.这显然是接口的一个缺点.
d.一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的登记结构中,而因为通常语言都限制一个类只能从最多一个超类继承,所以将抽象做为类型定义工具的效能大打折扣.
反过来,看接口,就会发现任何一个实现了一个接口所规定的方法的类均可以具备这个接口的类型,而一个类能够实现任意多个接口.
e.从代码重构的角度上讲,将一个单独的具体类重构成一个接口的实现是很容易的,只须要声明一个接口,并将重要的方法添加到接口声明中,而后在具体类定义语句中加上保留字以继承于该接口就好了.
而做为一个已有的具体类添加一个抽象类做为抽象类型不那么容易,由于这个具体类有可能已经有一个超类.这样一来,这个新定义的抽象类只好继续向上移动,变成这个超类的超类,如此循环,最后这个新的抽象类一定处于整个类型等级结构的最上端,从而使登记结构中的全部成员都会受到影响.
f.接口是定义混合类型的理想工具,所为混合类型,就是在一个类的主类型以外的次要类型.一个混合类型代表一个类不只仅具备某个主类型的行为,并且具备其余的次要行为.
g.联合使用接口和抽象类:
因为抽象类具备提供缺省实现的优势,而接口具备其余全部优势,因此联合使用二者就是一个很好的选择.
首先,声明类型的工做仍然接口承担的,可是同时给出的还有一个抽象类,为这个接口给出一个缺省实现.其余同属于这个抽象类型的具体类能够选择实现这个接口,也能够选择继承自这个抽象类.若是一个具体类直接实现这个接口的话,它就必须自行实现全部的接口;相反,若是它继承自抽象类的话,它能够省去一些没必要要的的方法,由于它能够从抽象类中自动获得这些方法的缺省实现;若是须要向接口加入一个新的方法的话,那么只要同时向这个抽象类加入这个方法的一个具体实现就能够了,由于全部继承自这个抽象类的子类都会从这个抽象类获得这个具体方法.这其实就是缺省适配器模式(DefauleAdapter).
h.什么是高层策略呢?它是应用背后的抽象,是那些不随具体细节的改变而改变的真理.它是系统内部的系统____隐喻.
2.5 接口隔离原则ISP(Interface Segregation Principle)
a.一个类对另一个类的依赖是创建在最小的接口上。
b.使用多个专门的接口比使用单一的总接口要好.根据客户须要的不一样,而为不一样的客户端提供不一样的服务是一种应当获得鼓励的作法.就像"看人下菜碟"同样,要看客人是谁,再提供不一样档次的饭菜.
c.胖接口会致使他们的客户程序之间产生不正常的而且有害的耦合关系.当一个客户程序要求该胖接口进行一个改动时,会影响到全部其余的客户程序.所以客户程序应该仅仅依赖他们实际须要调用的方法.
2.6 合成/聚合复用原则CARP(Composite/AggregateReuse Principle)
在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象经过这些向对象的委派达到复用已有功能的目的.这个设计原则有另外一个简短的表述:要尽可能使用合成/聚合,尽可能不要使用继承.
2.7 迪米特法则(Law of Demeter LoD)又叫作最少知识原则LKP(Least KnowledgePrinciple)
对其余对象有尽量少的了了解.
迪米特法则最初是用来做为面向对象的系统设计风格的一种法则,与1987年秋天由IanHolland在美国东北大学为一个叫作迪米特(Demeter)的项目设计提出的,所以叫作迪米特法则[LIEB89][LIEB86].这条法则其实是不少著名系统,好比火星登录软件系统,木星的欧罗巴卫星轨道飞船的软件系统的指导设计原则.
没有任何一个其余的OO设计原则象迪米特法则这样有如此之多的表述方式,以下几种:
a.只与你直接的朋友们通讯(Onlytalk to your immediate friends)
b.不要跟"陌生人"说话(Don'ttalk to strangers)
c.每个软件单位对其余的单位都只有最少的知识,并且局限于那些本单位密切相关的软件单位.
就是说,若是两个类没必要彼此直接通讯,那么这两个类就不该当发生直接的相互做用,若是其中的一个类须要调用另外一个类的某一个方法的话,能够经过第三者转发这个调用。
常说的OO五大原则
单一职责原则;开放闭合原则;里氏替换原则;依赖倒置原则;接口隔离原则;
3 参考文献
【01】《大话设计模式》(中文版),《design patterns:elements of reusable object-oriented software》(英文版)
【02】《设计模式》(可复用面向对象软件的基础)(中文版),《Design Patterns Elements of Reusable Object-Oriented Software》(英文版)
【03】《Head First设计模式》(中文版), 《Head First Design Patterns》(英文版)
【04】《C#设计模式》(中文版),《C# Design Patterns:A Tutorial》(英文版)
【05】《Java企业设计模式》(中文版),《Java Enterprise Design Patterns》(英文版)
【06】 《UML和模式应用》(面向对象分析与设计导论)(中文版), 《Applying UML and Patterns:An Introduction to Object-Oriented Analysis and Design》(英文版)
【07】 《设计模式解析》(中文版),《Design Patterns Explained:A New Perspective on Object-Oriented Design》
【08】 《.NET 设计规范--.NET约定、惯用法与模式》(中文版),《Framework Design Guidelines : Conventions, Idioms, and Patterns for Reusable .NET Libraries》(英文版)
【09】 《重构与模式》(中文版),《Refactoring to Patterns》(英文版)
【10】 《设计模式解析》(中文版),《Design Patterns Explained:A New Perspective on Object-Oriented Design ,Second Edition》(英文版)
【11】 《深刻浅出设计模式》(中文版),(C#/Java版)
【12】 《多线程与并发处理》
【13】 《企业应用架构模式》 (中文版),《Patterns of Enterprise Application Architecture》(英文版)
4 版权