开闭原则

第四章 开放封闭原则

一曲冷凌霜 提交于 2020-04-07 21:38:10
开闭原则的定义 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出: 软件实体应当对扩展开放,对修改关闭 (Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。 这里的软件实体包括以下几个部分: 项目中划分出的模块 类与接口 方法 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 开闭原则的作用 开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适应性和灵活性的同时具备稳定性和延续性。具体来说,其作用如下。 对软件测试的影响 软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。 可以提高代码的可复用性 粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。 可以提高软件的可维护性 遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。 开闭原则的实现方法 可以通过“抽象约束、封装变化

开闭原则

。_饼干妹妹 提交于 2020-03-26 10:03:37
1起源与发展 1.1梅耶开闭原则 伯特兰·梅耶一般被认为是最早提出开闭原则这一术语的人,在他1988年发行的《面向对象软件构造》中给出。这一想法认为一旦完成,一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类实现。新建的类可以通过继承的方式来重用原类的代码。衍生的子类可以或不可以拥有和原类相同的接口。 梅耶的定义提倡实现继承。具体实现可以通过继承方式来重用,但是接口规格不必如此。已存在的实现对于修改是封闭的,但是新的实现不必实现原有的接口。 1.2多态开闭原则 在20世纪90年代,开闭原则被广泛的重新定义。由于抽象化接口的使用,在这中间实现可以被改变,多种实现可以被创建,并且多态化的替换不同的实现。 相比梅耶的使用方式,多态开闭原则的定义倡导对抽象基类的继承。接口规约可以通过继承来重用,但是实现不必重用。已存在的接口对于修改是封闭的,并且新的实现必须,至少,实现那个接口。 罗伯特·C·马丁1996年发表的文章《开闭原则》是使用这种方法的启发式著作。在2001年,Craig Larman把开闭原则关联到了Alistair Cockburn的名为受护的变量的模式以及David Parnas关于信息隐藏的讨论。 2原理思想 2.1问题由来 在软件的生命周期内,因为变化,升级和维护等原因需要对软件原有代码进行修改,可能会给旧代码引入错误

开闭原则

浪尽此生 提交于 2020-03-20 20:26:44
走向设计1--"开-闭原则" 这些OOD原则的一个基石就是"开-闭原则"(Open-Closed Principle OCP).这个原则最早是由Bertrand Meyer提出,英文的原文是:Software entities should be open for extension,but closed for modification.意思是说,一个软件实体应当对扩展开放,对修改关闭.也就是说,我们在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,换句话说就是,应当可以在不必修改源代码的情况下改变这个模块的行为. 满足OCP的设计给系统带来两个无可比拟的优越性. 1.通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性. 2.已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性. 具有这两个优点的软件系统是一个高层次上实现了复用的系统,也是一个易于维护的系统.那么,我们如何才能做到这个原则呢?不能修改而可以扩展,这个看起来是自相矛盾的.其实这个是可以做到的,按面向对象的说法,这个就是不允许更改系统的抽象层,而允许扩展的是系统的实现层. 解决问题的关键在:抽象化.我们让模块依赖于一个固定的抽象体,这样它就是不可以修改的;同时,通过这个抽象体派生

工厂模式——我有不止一个对象

二次信任 提交于 2020-03-19 14:58:12
3 月,跳不动了?>>> 3年工作经验是吧? 你知道工厂模式分为几类吗?他们都有什么区别? 那你说说你们项目中是怎么使用工厂模式的? 带着问题,尤其是面试问题的学习才是最高效的。加油,奥利给! 文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 工厂模式可以分为三类: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 简单工厂其实不是一个标准的的设计模式。GOF 23种设计模式中只有「工厂方法模式」与「抽象工厂模式」。简单工厂模式可以看为工厂方法模式的一种特例,为了统一整理学习,就都归为工厂模式。 这三种工厂模式在设计模式的分类中都属于 创建型模式 ,三种模式从上到下逐步抽象。 创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节

06-开闭原则(OCP)

久未见 提交于 2020-03-13 00:55:44
1. 背景 在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。 2. 定义 一个软件实体如类、模块和函数应该对 扩展开放 ,对 修改关闭 。 3. 解决方案 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。 4. 深度理解(下面理解来源于网络) 开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。 开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修改关闭,并没有明确的告诉我们。 以前,如果有人告诉我“你进行设计的时候一定要遵守开闭原则”,我会觉的他什么都没说,但貌似又什么都说了。因为开闭原则真的太虚了。 在仔细思考以及仔细阅读很多设计模式的文章后,终于对开闭原则有了一点认识。其实,我们遵循设计模式前面5大原则,以及使用23种设计模式的目的就是遵循开闭原则。 也就是说,只要我们对前面5项原则遵守的好了,设计出的软件自然是符合开闭原则的,这个开闭原则更像是前面五项原则遵守程度的“平均得分”,前面5项原则遵守的好,平均分自然就高,说明软件设计开闭原则遵守的好;如果前面5项原则遵守的不好,则说明开闭原则遵守的不好。 其实笔者认为

设计模式的六大原则

喜欢而已 提交于 2020-03-07 13:06:35
一、单一职责原则(Single Responsibility Principle) 二.开闭原则(Open-Closed Principle, OCP) 三、里氏代换原则(Liskov Substitution Principle, LSP) 四、依赖倒置原则(Dependence Inversion Principle,DIP) 五、接口隔离原则(Interface Segregation Principle, ISP) 六、迪米特法则(Law of Demeter, LoD) 总结 一、单一职责原则(Single Responsibility Principle) 定义:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。 问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有 可能会导致原本运行正常的职责P2功能发生故障。 单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中

开闭原则 Open Closed Principle

风流意气都作罢 提交于 2020-03-04 08:33:52
开闭原则的介绍: 1) 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则 2) 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。 3) 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。 4) 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。 错误示例 package com.kittenplus.principle.ocp; public class ocp { public static void main(String[] args) { GraphicEditor ge = new GraphicEditor(); ge.drawShape(new Rectangle() ); ge.drawCircle(new Circle()); }} //这是一个用于绘图的类 class GraphicEditor { //接收Shape对象,然后根据Type绘制不同的图形 public void drawShape(Shape s) { if (s.m_type == 1) drawRectangle(s); else if (s.m_type == 2) drawCircle(s); } public void

设计模式之开闭原则

假如想象 提交于 2020-02-29 02:47:38
开放封闭原则 (对扩展开放(Open for extension),对修改封闭(Closed for modification))是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所带来的巨大好处,也就是可维护、可扩展、可复用、灵活性好,开发人员应该仅对程序中频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。 接下来以一个计算器类来作为开闭原则案例: # include <iostream> using namespace std ; //开闭原则:对扩展开放,对修改关闭;增加功能时,通过增加代码实现,而不是修改源代码。 //利用面向对象编程的:继承和多态来实现开闭原则 //多态满足条件: //1、有继承关系 //2、子类重写父类中的虚函数 //多态使用: //父类指针或引用指向子类对象 //写一个抽象类,具有纯虚函数的类称为抽象类 class AbstractCaculator { public : virtual int getResult ( ) = 0 ; //纯虚函数 函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。 virtual void setNum ( int a , int b ) = 0 ; } ; //加法计算器 class

软件设计笔记:开闭原则

走远了吗. 提交于 2020-02-26 23:39:26
开闭原则 软件实体(模块、类、函数等)应该对扩展是开发的,对修改是关闭的。 通俗的讲就是:软件功能是可以扩展的,但是软件实体是不可以被修改的。 当我们在代码中看到else 或者 switch/case 关键字的时候,基本可以判断违反开闭原则了。 策略模式、适配器模式、观察者模式、模板方法模式都可以实现开闭原则,可以在不同场景中解决 if/else 或 switch/case 问题。 来源: oschina 链接: https://my.oschina.net/u/939952/blog/3164958

《Spring5核心原理与30个类手写实践 》第一章 阅读笔记

天涯浪子 提交于 2020-02-10 17:14:08
                                第一章 软件架构设计原则 1.1开闭原则-对扩开放,对修改关闭。开闭原则的核心思想就是面向抽象编程。 1.2依赖倒置原则。大家一定要切记:以抽象为基准比以细节为基准搭建起来的架构要稳定的多,因此在拿到需求之后,要面向接口编程,先顶层再细节的设计代码结构。 1.3单一职责原则。总体来说,就是一个类,接口或者方法只负责一项职责。 1.4接口隔离原则。建立单一接口,不要建立臃肿庞大的接口。尽量细化接口,接口中的方法尽量少(适度)。 1.5迪米特原则-最少知道原则。 1.6里氏替换原则。 1.7合成复用原则。 来源: https://www.cnblogs.com/la5qianer/p/12291435.html