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