何为抽象?你有本末倒置吗?

最后更新于:2022-04-01 09:30:38

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