一、何为抽象?
提到抽象,你会想到什么?是这些吗?
-
抽象是面向对象的基础,有了抽象才会有面向对象的三大特征:继承,封装,多态。
-
层与层联系要依赖抽象,上层依赖抽象,下层也要依赖抽象。
-
总之中的一个句话,编程就是要依赖抽象。
它不是抽象,它是抽象的一些体现,也就是说这都是抽象后的结果,抽象的优点优点。作为程序猿的我们要的就是抽象带来的这些结果,可是我们更重要的一个任务是,怎样做出“抽象”?把抽象敲出来,有代码来体现。对于程序猿来说,仅仅有将想法落实到代码上才是编程,是有质量的编程。
二、为什么抽象
那么何为抽象?
-
有同样就抽象
-
不同领域要联系须要抽象
为什么要抽象?
抽象的最直接目的:为了变化,方便交流。
这两个问题往往是分不开的,没有目的的抽象就是无意义的工作。所以在这里一块说说我的看法。
先说第一点:有同样就抽象。遇到几个类有同样的特性:方法也好,属性也好,就能够去使用抽象了。
1、变动少。凡是这样的总体的改动,假设有抽象的父类,仅仅要在父类中改动,子类继承就可以。省去该多处的麻烦,最怕的是没有改完。
2、接口统一,多种选择。有抽象,就意味着子类能够有多种实现;多态在这个时候就是最完美的诠释了抽象的奇妙。对外是统一的,可是却能够选择不同的“子类”,达到不同的效果。
3、扩展是极方便的。当前存在的类的实现不能满足我的须要,我仅仅须要添加一个继承抽象的子类,定义须要的新实现就能够达到目的,与“开闭原则”吻合。
其次是:不同领域要联系须要抽象——解耦紧密相邻的关系
在普通的只是的是,无论什么牌子的USB数据线,都能够接通不论什么牌子的电脑的USB接口。
这里的接口就是抽象出来的一套规范,仅仅要不同的“领域”把要接触的“接口”规定好,就能够依照这个接口的约定去进行各种实现了。在编程中更是,为了编码变得简单,为了系统系能好,为了合作开发,一个系统被分成了“N”层,分层的目的,是为了解耦, 要直接联系的两个类通过一组约定,有直接联系编程间接联系。在遵守约定的情况下,进行各自的开发。互不影响。
在普通的只是的是,无论什么牌子的USB数据线,都能够接通不论什么牌子的电脑的USB接口。
这里的接口就是抽象出来的一套规范,仅仅要不同的“领域”把要接触的“接口”规定好,就能够依照这个接口的约定去进行各种实现了。在编程中更是,为了编码变得简单,为了系统系能好,为了合作开发,一个系统被分成了“N”层,分层的目的,是为了解耦, 要直接联系的两个类通过一组约定,有直接联系编程间接联系。在遵守约定的情况下,进行各自的开发。互不影响。
假设没有接口,直接发生关系就会这样:
1、每走一条线,都须要从头走到尾;假设一处做不好,就无法执行;
2、一处方法发生变动,特别是底层方法,调用这种方法的全部的类都须要变动。
3、需求变动,要求更换曾经类的运行过程,好比商场打折,有多种选择的情况下,仅仅能添加类,在须要的时候,暂时更改调用那个,对于公布的系统,这可不能算一种解决方式。
(这里的领域,你能够理解成层。层的概念也是可大可小,没有严格限制,有代码经验的人依据经验来划分自己的层)
从抽象的由来就能够看出,抽象出现就是为了“交流”。假设说这个类在系统中永远仅仅是这样,不会扩展,不会被传承,不会发生变化,那么就没有抽象的必要了,由于它是“唯一的”。 不变化,交流不影响,要变化,还要交流就必须抽象。
1、每走一条线,都须要从头走到尾;假设一处做不好,就无法执行;
2、一处方法发生变动,特别是底层方法,调用这种方法的全部的类都须要变动。
3、需求变动,要求更换曾经类的运行过程,好比商场打折,有多种选择的情况下,仅仅能添加类,在须要的时候,暂时更改调用那个,对于公布的系统,这可不能算一种解决方式。
(这里的领域,你能够理解成层。层的概念也是可大可小,没有严格限制,有代码经验的人依据经验来划分自己的层)
从抽象的由来就能够看出,抽象出现就是为了“交流”。假设说这个类在系统中永远仅仅是这样,不会扩展,不会被传承,不会发生变化,那么就没有抽象的必要了,由于它是“唯一的”。 不变化,交流不影响,要变化,还要交流就必须抽象。
三、抽象的体现形式
1、抽象成基类。
大家熟知的形式。将相似的几个类中能够抽象的成员拿出来,形成他们的基类。
基类也可分为抽象类和接口,抽象类和接口的差别在于:基类是对属性和方法的抽象,側重是对“代码反复”的解决;接口是对方法的抽象,避免“方法反复”。
2、合并同类项,不添加父类。
这样的方式,是近期学习设计模式的时候突然的理解。在工厂模式到抽象工厂模式改造的过程就是这样。大家看分析。工厂模式:仅仅建立一个产品:Button。类图例如以下:
建立还有一个产品:Text。类图例如以下:
观察两个类图,一模一样的工厂模式,一次却仅仅能实现一个产品,要是实现两个产品,就须要把两个图结合起来,那就成“大物”了。让咱们来合并同类相吧。
1、两个Factory,合并,方法+1;两个UnixFactroy,合并,可是方法+1;两个WindowFactory,合并,方法+1。之所以能够合并时由于他们本质一样。
2、可是详细的Button,text抽象类和详细的实现类可不能合并了,他们本质不一样。
看合并的结果:
1、两个Factory,合并,方法+1;两个UnixFactroy,合并,可是方法+1;两个WindowFactory,合并,方法+1。之所以能够合并时由于他们本质一样。
2、可是详细的Button,text抽象类和详细的实现类可不能合并了,他们本质不一样。
看合并的结果:
不添加父类,添加第三者。
这是最简单的一种抽象,也是经常使用的一种,预计有些人没把它当成抽象。
把多个类中用到的同样方法拿出,作为公共方法,放到第三个类中。这是我们经经常使用到的,和其它类不建立继承或实现关系,须要的时候就引用。当然在某种情况下,这个第三个类可能被抽象成接口来对待,详细的不做讨论,情况太多,详细对待。
总结:
抽象来源于个体,多了才抽象。
现有的子类,抽象后,才有的基类。
分析设计模式的时候,从简单入手,画着画着,就有了父类,有了继承,明确的抽象的存在;写代码也是,先写,写着写着就有了抽象类,有了接口。
以上就是这些天对抽象的思考。欢迎大家指正。