开放与封闭原则

开放与封闭原则(Open/Closed Principle,OCP):

               软件实体应用允许扩展,但禁止修改。当应用需求改变时,可以对其模块进行扩展,使其满足需求变更的新行为。但对模块进行扩展时,不必改动该模块的源代码后二进制代码。

扩展点:

        1、没有扩展点的代码:如果一个类没有扩展点,那么当这个类需要添加新需求时,需要修改这个类中的方法,这样违背了封闭原则。为了满足新需求,需要创建一个新类来实现新需求的功能。

          2、虚方法:类中创建虚方法成员,这个虚方法就是一个扩展点。使用继承技术使子类可以修改虚方法。使用多态可以不需要修改客户端实现功能扩展。缺点:子类要么在基类方法上添加新功能,要么从新编写新功能,不存在中间状态(获取基类代码,在基类代码上进行修改)。与继承相同,子类对基类的私有成员不可见。

         3、抽象方法:创建抽象基类,基类中创建几个抽象方法。子类继承基类后实现抽象方法。各创建出的子类相互不影响,可以实现各自的功能。并且客户端只需要依赖抽象基类,任何实现的子类都满足要求。

         4、接口继承:

                   基于实现继承,所有子类(现有的和将来的)都是基类的客户端,子类都是依赖基类实现的。因此所有对实现的改动都会是客户端可能察觉到的改动。因此相对于继承,通常会建议优先选择组合,如果必须要使用继承,也要尽量使用只有少量分层的浅继承层次结构。(给继承图顶部节点添加新成员的改动会影响到该层次结构下的所有成员)

                   接口继承可以根据不同的上下文给接口修饰丰富的功能(为接口添加修饰器)。接口比类灵活,具有强大的自适应性能力。

防止变异(protected variation):识别可预见的变化点并围绕他们创建一个稳定的接口。

             1、可预见的变化(predicted variation):单个类的需求应该直接与客户端的一个业务需求关联起来。冲刺过程中,开发人员可以提出预测将来潜在的相关需求,创建扩展点。

              2、一个稳定的接口:客户端依赖接口,如果接口发生变化,客户端也需要做响应的改变。用于表达扩展点的所有接口应该是稳定的,接口改变的可能性和频率应该很低,否则所有依赖的客户端都需要进行修改。

              3、足够的自适应能力:只在合适的位置上包含恰当数目的扩展点的代码被称为代码的“宜居带”。他能适应代码的变更需求,同时也不会增加复杂度和过度设计方案。

             

猜你喜欢

转载自blog.csdn.net/Sbjhy/article/details/81407731