一,抽象类
1.1,什么是抽象类?
抽象类每每用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不一样,可是本质上相同的具体概念的抽象。好比,在一个图形编辑软件的分析设计过程当中,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不一样的,可是它们又都属于形状这样一个概念,形状这个概念在问题领域并非直接存在的,它就是一个抽象概念。而正是由于抽象的概念在问题领域没有对应的具体概念,因此用以表征抽象概念的抽象类是不可以实例化的。函数
1.2,为何要使用抽象类?
在面向对象程序设计中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,可是这组行为却可以有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为全部可能的派生类。模块能够操做一个抽象体。因为模块依赖于一个固定的抽象体,所以它能够是不容许修改的;同时,经过从这个抽象体派生,也可扩展此模块的行为功能。为了可以实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。设计
二,开闭原则
2.1,什么是开闭原则?
开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它不少的设计原则都是实现开闭原则的一种手段。开闭原则是说软件实体(类、模块、函数等)应该能够扩展,可是不能够修改。开闭原则的意思就是说,在设计软件的时间要时刻考虑,尽可能让这个类是足够好的,写好了就不要去修改,若是新需求来,经过增长类来实现新需求的功能,原来的代码能不动就不动。也就是说,面对新需求,对程序的改动是经过增长新代码进行的,而不是更改现有的代码,这就是开闭原则的精髓所在。对象
2.2,开闭原则设计出的模块具备两个主要特征
对于扩展是开放的(Open for extension): 这意味着模块的行为是能够扩展的。当应用的需求改变时,能够对模块进行扩展,使其具备新的功能知足需求的变化。
对于修改是关闭的(Closed for modification): 对模块进行扩展时,没必要改动模块原有的代码或者二进制代码。模块的二进制可执行版本,不管是可连接的库、DLL或者.EXE文件,都无需改动。
2.3,什么时候应对变化?
不管模块是多么的封闭,都会存在一些没法对之封闭的变化。既然不能彻底封闭,设计人员必须对于他设计的模块应该对哪些变化封闭做出选择。必须先猜想出最有可能发生变化的种类,而后构建抽象来隔离那些变化。
事先猜想全部的变化,很是难作到也不现实,能够在最初设计软件时,假设变化不会发生,等到变化发生时,马上采起行动建立抽象来隔离之后发生的同类变化。例如:以前作的计算器程序,刚开始只能进行加减运算,此时若是要增长乘除运算就要修改原来的类,违背了开闭原则,为了应对这个变化,就该考虑重构程序,增长一个抽象的运算符类,经过一些面向对象的手段来隔离之后发生的同类变化。
并非何时应对变化都是很容易的,在开发的过程当中应尽量早的知道可能发生的变化。查明可能发生的变化的时间越久,要建立正确的抽象就越困难。例如:以前作的计算器程序,若是加减法在不少地方都用到了,再考虑抽象、考虑分离就很困难。
2.4,实现方法
实现开闭原则的关键就在于“抽象”。把系统的全部可能的行为抽象成一个抽象底层,这个抽象底层规定出全部的具体实现必须提供的方法的特征。做为系统设计的抽象层,要预见全部可能的扩展,从而使得在任何扩展状况下,系统的抽象底层不需修改;同时,因为能够从抽象底层导出一个或多个新的具体实现,能够改变系统的行为,所以系统设计对扩展是开放的。在实际开发过程的设计开始阶段,就要罗列出来系统全部可能的行为,并把这些行为加入到抽象底层,根本就是不可能的,这么去作也是不经济的。所以应该现实的接受修改拥抱变化,使编写的代码能够对扩展开放,对修改关闭。
ip