您的位置:首页 >  新闻中心 > 云通讯公告
  云通讯公告
 

聊聊面向对象编程的几个基本原则

来源:原创    时间:2017-10-31    浏览:0 次

进行面向目标编程,有下面几个准则: 
一. 面向笼统准则 
二. 开闭准则 
三. 多用组合少用承继准则 
四. 高内聚-低耦合准则 
一. 面向笼统准则

下面首要先介绍笼统类和接口,然后介绍面向笼统编程。

笼统类和接口
1.1 笼统类

笼统类(abstract)具有如下特色:

笼统类中可以有abstract办法,也可以有非abstract办法。

笼统类不能运用new运算符创立目标。

如果一个非笼统类是某个笼统类的子类,那么它有必要重写父类的abstract办法,即在子类中将abstract办法从头声明,但有必要去掉abstract修饰符,一起要确保声明的办法姓名,回来类型,参数个数和类型与父类的abstract办法完全相同。

作为上转型目标。虽然笼统类不能运用new运算符创立目标,但其非abstract子类有必要要重写悉数abstract办法,这样一来,就可以让笼统类声明的目标成为其子类目标的上转型目标,并调用子类重写的办法。

例如,下面笼统类A中有一个abstract办法add(int x,int y);



下列B是A的一个非abstract子类,子类B在重写父类A中的abstract办法add(int x,int y)时,将其完成为核算参数x与y的和。


假定b是子类B创立的目标,那么可以让A类声明的目标a成为目标b的上转型目标,即让a寄存b的引证。上转型目标可以调用子类重写的add()办法,例如:



1.2 接口 
如果你也想在IT职业拿高薪,可以参与我们的训练营课程,挑选最适合自己的课程学习,技能大牛亲授,7个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高功能及分布式、高功能、浅显易懂。高架构。功能调优、Spring,MyBatis,Netty源码剖析和大数据等多个知识点。

接口(interface)具有如下特色:

接口中只可以有public权限的abstract办法,不能有非abstract办法。

接口由类去完成,即一个类如果完成一个接口,那么它有必要重写接口中的abstract办法,行将abstract办法从头声明,但有必要去掉abstract 
修饰符,一起要确保声明的办法姓名,回来类型,参数个数和类型与接口中的办法完全相同。

接口回调。接口回调是指可以把完成接口的类的目标的引证赋给该接口声明的接口变量中,那么该接口变量就可以调用被类完成的接口中的办法,当接口变量调用被类完成的接口中的办法时,就是告诉相应的目标调用接口的办法,这一进程称为目标办法的接口回调。

例如,下面接口Com中有一个abstract办法sub(int x,int y);



ComImp是完成Com接口的类,ComImp类在重写Com接口中的abstract 办法sub(int x,int y)时,将其完成为核算参数x与y的差:



可以让Com接口声明的接口变量com寄存ComImp类的目标引证,那么com就可以调用ComImp类完成的接口中的办法。例如:

![图片描绘](http://img.blog.csdn.net/20171021141937930?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFucGk0NjQ4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
面向笼统
所谓面向笼统编程,是指当规划一个类时,不让该类面向详细的类,而是面向笼统类或许接口,即所规划类中的重要数据是笼统类或接口声明的变量,而不是详细类声明的变量。

以下通过一个简略的比方阐明面向笼统编程的思维。

比方,已经有了一个Circle类,该类创立的目标circle调用getArea()办法可以核算圆的面积,Circle类的代码如下:



现在要规划一个Pillar类(柱类),该类的目标调用getVolume()办法可以核算柱体体积,Pillar类的代码如下:



上述Pillar类中,bottom是用详细类Circle声明的变量,如果不触及用户需求的改动,上面的Pillar类的规划没有任何不当,但是在某个时分,用户期望Pillar能创立出底是三角形的柱体。明显上述Pillar类无法创立出这样的柱体,即上述规划的Pillar类不应对用户的这种需求。

现在从头来规划Pillar类。首要,注意到柱体核算体积的关键是核算出底面积,一个柱体在核算底体积时不应该联系它的底是怎样形状的详细图形,应该只关怀这种图形是否具有核算面积的办法。因而,在规划Pillar类时不应当让它的底是某个详细类声明的变量,一旦这样做,Pillar类就依靠详细的类,缺少弹性,难以应对需求的改动。

下面将面向笼统从头规划Pillar类。首要编写一个笼统类Geometry(或接口),该笼统类(接口)中界说了一个笼统的getArea()办法。



现在Pillar类的规划者可以面向Geometry 类编写代码,即Pillar类应当把Geometry目标作为自己的成员,该成员可以调用Geometry的子类重写的getArea()办法。这样一来,Pillar类就可以将核算底面积的使命指派给完成Geometry类的子类的实例(如果Geometry是一个接口,Pillar类就可以将核算底面积的使命指派给完成Geometry接口的类的实例)。

以下Pillar类的规划不再依靠详细类,而是面向Geometry类,即Pillar类中的bottom是用笼统类Geometry声明的变量,而不是详细类声明的变量。从头规划Pillar类的代码如下:


下面Circle类和Rectangle类都是Geometry的子类,二者都有必要重写Geometry 类的getArea()办法来核算各自的面积。

Circle.java



Rectangle.java



现在,就可以用Pillar类创立出具有矩形底或许圆形底的柱体了,如下列Application.java所示:



通过面向笼统来规划Pillar类,使得该Pillar类不再依靠详细类,因而每逢体系添加新的Geometry的子类时,比方添加一个Triangle子类,那么不需求修正Pillar类的任何代码,就可以运用Pillar创立出具有三角形底的柱体。

二. 开闭准则

所谓”开闭准则”(Open-Closed Principle)就是让规划对拓宽敞开,对修正封闭。怎样了解对拓宽敞开,对修正封闭呢?实际上这句话的实质是指当一个规划中添加新的模块时,不需求修正现有的模块。在给出一个规划是,应该首要考虑到用户需求的改动,将应对用户改动的部分规划为对拓宽敞开,而规划的中心部分是通过精心考虑过之后断定下来的根本结构,这部分应该是对修正封闭的,即不能由于用户的需求改动而再发生改动,由于这部分不是用来应对需求改动的。如果规划恪守了”开-闭准则”,那么这个规划必定是易保护的,由于在规划中添加新的模块时,不用去修正规划中的中心模块。比方上面代码给出的规划中有四个类,类图如下所示:



该规划中的Geometry和Pillar类就是体系中队修正封闭的部分,而Geometry的子类是对拓宽敞开的部分。当向体系再添加任何Geometry的子类时(对拓宽敞开),不用修正Pillar类,就可以运用Pillar创立出具有Geometry的心子类指定的底的柱体。

一般无法让规划的每个部分都恪守”开-闭准则”,甚至不应当这样去做,应当把首要精力会集在应对规划中最有可能因需求改动而需求改动的当地,然后想办法运用”开-闭准则”。

当规划某些体系时,常常需求面向笼统来考虑体系的总体规划,不要考虑详细类,这样就简单规划出满意”开-闭准则”的体系,在程序规划好后,首要对abstract类的修正封闭,不然,一旦修正abstract类,比方,为它添加一个abstract办法,那么abstract类一切的子类都需求做出修正;应该对添加abstract类的子类敞开,即在程序中再添加子类时,不需求修正其他面向笼统类而规划的重要类。

三.多用组合少用承继准则

办法复用的两种最常用的技能就是类承继和目标组合

承继和复用
子类承继父类的办法作为自己的一个办法,就好像它们是在子类中直接声明一样,可以被子类中自己声明的任何实例办法调用。也就是说,父类的办法可以被子类以承继的办法复用。

通过承继来复用父类的办法的长处是:

子类可以重写父类的办法,即易于修正或许拓宽那些被复用的办法。

通过承继来复用父类的办法的缺陷是:

子类从父类承继的办法在编译时就断定下来了,所以无法在运转期间改动从父类承继的办法的行为。

子类和父类的联系是强耦合联系,也就是说当父类的办法的行为更改时,必定导致子类发生改动。

3.通过承继进行复用也称”白盒”复用,其缺陷是父类的内部细节关于子类而已是可见的。

组合和复用
一个类的成员变量可以是Java答应的任何数据类型,因而,一个类可以把目标当作自己的成员变量,如果用这样的类创立目标,那么该目标中就会有其他目标,也就是说,该目标将其他目标作为自己的组成部分(这就是人们常说的Has——A),或许说该目标是由几个目标组合而成。

如果一个目标a组合了目标b,那么目标a就可以托付目标b调用其办法,即目标a以组合的办法复用目标b的办法/

通过组合目标来复用办法的长处是:

通过组合来复用办法也称”黑盒”复用,由于当时目标只能托付所包括的目标调用其办法,这样一来,当时目标所包括目标办法的细节对当时目标是不行见的。
2.目标与所包括目标归于弱耦合联系,由于,如果修正当时目标所包括目标类的代码,不用修正当时目标类的代码。

3.当时目标可以在运转时动态指定所包括的目标,例如,假定Com是以恶搞接口,该接口中有一个computer()办法,那么下列Computer类的目标可以在运转时动态指定所包括的目标,即运转期间,Computer类的实例可调用setCom(Com com)办法将其间的com变量寄存任何完成Com接口目标的引证。



通过组合目标来复用办法的缺陷是:

1.简单导致体系中的目标过多。

2.为了可以组合多个目标,有必要细心的对接口进行界说

多用组合,少用承继
之所以发起多用组合,少用承继,是由于在许多规划中,人们期望体系的类之间尽量是低耦合联系,而不期望是强耦合联系。即在许多情况下需求避开承继的缺陷,而需求组合的长处。怎样样合理地运用组合,而不是运用承继来取得办法的复用需求通过必定时刻的认真思考,学习和编程实践才干悟出其间的道理。

四. 高内聚-低耦合准则

如果类中的办法是一组相关的行为,则称该类是高内聚的,反之称为低内聚的。搞内聚便于类的保护,而低内聚不利于类的保护。