面向对象的特征与“六原则一法则”

面向对象的特征

主要有抽象、继承、封装和多态四个方面,下面是咱们来详细分析它们的含义:前端

- 抽象:

抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 数据库

 

- 继承:

继承是从已有类获得继承信息建立新类的过程。提供继承信息的类被称为父类(超类、基类);获得继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了必定的延续性,同时继承也是封装程序中可变因素的重要手段。 编程

拓展:

    因为实际须要,某个类具备两个或两个以上的维度变化(例如咱们去吃面:有拉面和板面两种选择,在这两中选择之上还有牛肉面和鸡蛋面两种选择,在这两层之上还有清淡、微辣、超辣等选择),若是仅仅使用继承实现这种需求,设计将会变得很是臃肿,这里咱们能够引入桥接模式。桥接模式的作法就是把程序变化的部分抽象出来,让变化的部分与主类分离开来,从而将多个维度的变化完全分离。最后提供一个管理类来组合不一样维度上的变化,经过这个组合来知足业务须要。桥接模式在JavaEE应用中有很是普遍的应用。因为JavaEE应用须要实现跨数据库的功能,程序为了在不一样的数据库之间迁移,系统须要在持久化技术这个维度上存在改变;另外,系统也须要在不一样的业务逻辑之间迁移,所以也须要在业务逻辑这个维度迁移。所以,JavaEE应用都会推荐使用业务逻辑组件与DAO组件分离,让DAO组件负责持久化技术这个维度上的改变,让业务逻辑组件负责业务逻辑实现这个维度上的改变。JavaEE应用的DAO模式就是桥接模式的应用。从DAO组件的设计初衷来开,DAO组件是为了让应用在不一样的持久化技术之间自由切换,也就是为了分离系统在持久化技术维度上的变化,从这个角度来看,JavaEE应用分离出DAO组件就是遵循桥接模式的。设计模式

 

- 封装:

一般认为封装是把数据和操做数据的方法绑定起来,对数据的访问只能经过已定义的接口。面向对象的本质就是将现实世界描绘成一系列彻底自治、封闭的对象。咱们在类中编写的方法就是对实现细节的一种封装;咱们编写一个类就是对数据和数据操做的封装。能够说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(浏览器

拓展:

    能够想一想普通洗衣机和全自动洗衣机的差异,明显全自动洗衣机封装更好所以操做起来更简单;咱们如今使用的智能手机也是封装得足够好的,由于几个按键就搞定了全部的事情。 服务器

 

- 多态性:

多态性是指容许不一样子类型的对象对同一消息做出不一样的响应。简单的说就是用一样的对象引用调用一样的方法可是作了不一样的事情。多态性分为编译时的多态性和运行时的多态性。若是将对象的方法视为对象向外界提供的服务,那么运行时的多态性能够解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来讲都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可使用电池供电或者用交流电,甚至还有多是太阳能,A系统只会经过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟经过何种方式得到了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。ide

 运行时的多态是面向对象最精髓的东西,要实现多态须要作两件事:模块化

1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);工具

2). 对象造型(用父类型引用引用子类型对象,这样一样的引用调用一样的方法就会根据子类对象的不一样而表现出不一样的行为)。spa

 

面向对象的“六原则一法则”:

单一职责原则、开闭原则、依赖倒转原则、里氏替换原则、接口隔离原则、合成聚合复用原则和迪米特法则。

 

- 单一职责原则

一个类只作它该作的事情。

单一职责原则想表达的就是"高内聚",写代码最终极的原则只有六个字"高内聚、低耦合",就如同葵花宝典或辟邪剑谱的中心思想就八个字"欲练此功必先自宫",所谓的高内聚就是一个代码模块只完成一项功能,在面向对象中,若是只让一个类完成它该作的事,而不涉及与它无关的领域就是践行了高内聚的原则,这个类就只有单一职责。咱们都知道一句话叫"由于专一,因此专业",一个对象若是承担太多的职责,那么注定它什么都作很差。这个世界上任何好的东西都有两个特征,一个是功能单一,好的相机绝对不是电视购物里面卖的那种一个机器有一百多种功能的,它基本上只能照相;另外一个是模块化,好的自行车是组装车,从减震叉、刹车到变速器,全部的部件都是能够拆卸和从新组装的,好的乒乓球拍也不是成品拍,必定是底板和胶皮能够拆分和自行组装的,一个好的软件系统,它里面的每一个功能模块也应该是能够轻易的拿到其余系统中使用的,这样才能实现软件复用的目标。

 

- 开闭原则

软件实体应当对扩展开放,对修改关闭。

在理想的状态下,当咱们须要为一个软件系统增长新功能时,只须要从原来的系统派生出一些新类就能够,不须要修改原来的任何一行代码。

要作到开闭有两个要点:①抽象是关键,一个系统中若是没有抽象类或接口系统就没有扩展点;②封装可变性,将系统中的各类可变因素封装到一个继承结构中,若是多个可变因素混杂在一块儿,系统将变得复杂而换乱,若是不清楚如何封装可变性,能够参考《设计模式精解》一书中对桥梁模式的讲解的章节。

 

- 依赖倒转原则

面向接口编程。

该原则说得直白和具体一些就是声明方法的参数类型、方法的返回类型、变量的引用类型时,尽量使用抽象类型而不用具体类型,由于抽象类型能够被它的任何一个子类型所替代,请参考下面的里氏替换原则。

 

-里氏替换原则

任什么时候候均可以用子类型替换掉父类型。

关于里氏替换原则的描述,Barbara Liskov女士的描述比这个要复杂得多,但简单的说就是能用父类型的地方就必定能使用子类型。里氏替换原则能够检查继承关系是否合理,若是一个继承关系违背了里氏替换原则,那么这个继承关系必定是错误的,须要对代码进行重构。例如让猫继承狗,或者狗继承猫,又或者让正方形继承长方形都是错误的继承关系,由于你很容易找到违反里氏替换原则的场景。须要注意的是:子类必定是增长父类的能力而不是减小父类的能力,由于子类比父类的能力更多,把能力多的对象当成能力少的对象来用固然没有任何问题。

 

- 接口隔离原则

接口要小而专,毫不能大而全。

臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力,接口也应该是高度内聚的。例如,琴棋书画就应该分别设计为四个接口,而不该设计成一个接口中的四个方法,由于若是设计成一个接口中的四个方法,那么这个接口很难用,毕竟琴棋书画四样都精通的人仍是少数,而若是设计成四个接口,会几项就实现几个接口,这样的话每一个接口被复用的可能性是很高的。Java中的接口表明能力、表明约定、表明角色,可否正确的使用接口必定是编程水平高低的重要标识。

- 合成聚合复用原则

优先使用聚合或合成关系复用代码。

经过继承来复用代码是面向对象程序设计中被滥用得最多的东西,由于全部的教科书都无一例外的对继承进行了鼓吹从而误导了初学者,类与类之间简单的说有三种关系,Is-A关系、Has-A关系、Use-A关系,分别表明继承、关联和依赖。其中,关联关系根据其关联的强度又能够进一步划分为关联、聚合和合成,但说白了都是Has-A关系,合成聚合复用原则想表达的是优先考虑Has-A关系而不是Is-A关系复用代码,缘由嘛能够本身从百度上找到一万个理由,须要说明的是,即便在Java的API中也有很多滥用继承的例子,例如Properties类继承了Hashtable类,Stack类继承了Vector类,这些继承明显就是错误的,更好的作法是在Properties类中放置一个Hashtable类型的成员而且将其键和值都设置为字符串来存储数据,而Stack类的设计也应该是在Stack类中放一个Vector对象来存储数据。记住:任什么时候候都不要继承工具类,工具是能够拥有并可使用的,而不是拿来继承的。

 

- 迪米特法则

迪米特法则又叫最少知识原则,一个对象应当对其余对象有尽量少的了解。

迪米特法则简单的说就是如何作到"低耦合",门面模式和调停者模式就是对迪米特法则的践行。

拓展:

对于门面模式能够举一个简单的例子,你去一家公司洽谈业务,你不须要了解这个公司内部是如何运做的,你甚至能够对这个公司一无所知,去的时候只须要找到公司入口处的前台美女,告诉她们你要作什么,她们会找到合适的人跟你接洽,前台的美女就是公司这个系统的门面。再复杂的系统均可觉得用户提供一个简单的门面,Java Web开发中做为前端控制器的Servlet或Filter不就是一个门面吗,浏览器对服务器的运做方式一无所知,可是经过前端控制器就可以根据你的请求获得相应的服务。调停者模式也能够举一个简单的例子来讲明,例如一台计算机,CPU、内存、硬盘、显卡、声卡各类设备须要相互配合才能很好的工做,可是若是这些东西都直接链接到一块儿,计算机的布线将异常复杂,在这种状况下,主板做为一个调停者的身份出现,它将各个设备链接在一块儿而不须要每一个设备之间直接交换数据,这样就减少了系统的耦合度和复杂度。

以下图所示:

使用门面模式后:

迪米特法则用通俗的话来将就是不要和陌生人打交道,若是真的须要,找一个本身的朋友,让他替你和陌生人打交道。

相关文章
相关标签/搜索