开闭原则

一,抽象类

1.1,什么是抽象类?

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如,在一个图形编辑软件的分析设计过程中,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域并不是直接存在的,它就是一个抽象概念。而正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

1.2,为什么要使用抽象类?

在面向对象程序设计中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

二,开闭原则

2.1,什么是开闭原则?

开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。开闭原则是说软件实体(类、模块、函数等)应该可以扩展,但是不可以修改。开闭原则的意思就是说,在设计软件的时间要时刻考虑,尽量让这个类是足够好的,写好了就不要去修改,如果新需求来,通过增加类来实现新需求的功能,原来的代码能不动就不动。也就是说,面对新需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码,这就是开闭原则的精髓所在。

2.2,开闭原则设计出的模块具有两个主要特征

  1. 对于扩展是开放的(Open for extension): 这意味着模块的行为是可以扩展的。当应用的需求改变时,可以对模块进行扩展,使其具有新的功能满足需求的变化。
  2. 对于修改是关闭的(Closed for modification): 对模块进行扩展时,不必改动模块原有的代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。

2.3,何时应对变化?

  1. 无论模块是多么的封闭,都会存在一些无法对之封闭的变化。既然不能完全封闭,设计人员必须对于他设计的模块应该对哪些变化封闭作出选择。必须先猜测出最有可能发生变化的种类,然后构建抽象来隔离那些变化。
  2. 事先猜测所有的变化,非常难做到也不现实,可以在最初设计软件时,假设变化不会发生,等到变化发生时,立刻采取行动创建抽象来隔离以后发生的同类变化。例如:之前做的计算器程序,刚开始只能进行加减运算,此时如果要增加乘除运算就要修改原来的类,违背了开闭原则,为了应对这个变化,就该考虑重构程序,增加一个抽象的运算符类,通过一些面向对象的手段来隔离以后发生的同类变化。
  3. 并不是什么时候应对变化都是很容易的,在开发的过程中应尽可能早的知道可能发生的变化。查明可能发生的变化的时间越久,要创建正确的抽象就越困难。例如:之前做的计算器程序,如果加减法在很多地方都用到了,再考虑抽象、考虑分离就很困难。

2.4,实现方法

实现开闭原则的关键就在于“抽象”。把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的。在实际开发过程的设计开始阶段,就要罗列出来系统所有可能的行为,并把这些行为加入到抽象底层,根本就是不可能的,这么去做也是不经济的。因此应该现实的接受修改拥抱变化,使编写的代码可以对扩展开放,对修改关闭。

你可能感兴趣的:(大话设计模式)