`
LegenKniT
  • 浏览: 881 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

开闭原则

    博客分类:
  • J2EE
阅读更多

软件设计中的开闭原则

以下来自百度百科,之所以手抄一遍,是帮助自己细致读一遍。之间会加入自己的思考及疑问。

       开闭原则是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其他很多的设计原则都是实现开闭原则的一种手段。1988年,Bertrand Meyer在他的著作《Object Oriented Software Construction》中提出了开闭原则,它的原文是这样:“Software entities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。这句话说的略微有点专业,通俗讲,就是:软件系统中包含的各种组件,例如模块(Modules)、类(classes)、以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中的“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中的“闭”,是指对于原有代码的修改是关闭的,即不应该修改原有的代码。

 

开闭原则的实现

     实现开闭原则的关键就在于“抽象”。把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需要修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的。“我们在软件开发的过程中,一直都是提倡需求导向的。这就要求我们在设计的时候,要非常清楚地了解用户需求,判断需求中包含的可能的变化,从而明确在什么情况下使用开闭原则。”

      关于系统可变的部分,还有一个更具体的可变性封装原则(Principle of Encapsulation of Variation,EVP),它从软件工程实现的角度对开闭原则进行了进一步的解释。EVP要求在做系统设计的时候,对系统所有可能发生变化的部分进行评估和分类,每一个可变的因素都单独进行封装。我们在实际开发过程的设计开始阶段,就要罗列出来系统所有可能的行为,并把这些行为加入到底层抽象,根本就是不可能的,这么做也是不经济的,费时费力。另外,在设计开始阶段,对所有的可变因素进行预计和封装也不太现实,也是很难做得到。所以,开闭原则描绘的愿景只是一种理想情况或是极端状态,现实世界中是很难被完全实现的。我们只能在某些组件,在某种程度上符合开闭原则的要求。通过以上的分析,对于开闭原则,我们可以得出这样的结论:虽然我们不可能做到百分百的封闭,但是在系统设计的时候,我们还是要尽量做到这一点。对于软件系统的功能扩展,我们可以通过继承、重载或者委托等手段实现。以接口为例,它对修改就是封闭的,而对具体的实现是开放的,我们可以根据实际的需要提供不同的实现,所以接口是符合开闭原则的。

 

开闭原则的好处

      如果一个软件系统符合开闭原则的,那么从软件工程的角度来看,它至少具有这样的好处:可复用性好。我们可以在软件完成以后,仍然可以对软件进行扩展,加入新的功能,非常灵活。因此,这个软件系统就可以通过不断地增加新的组件,来满足不断变化的需求。

可维护性好

      由于对于已有的软件系统的组件,特别是它的抽象底层不去修改,因此,我们不用担心软件系统中原有组件的稳定性,这就使变化中的软件系统有一定的稳定性和延续性。

 

开闭原则与其他原则的关系

      开闭原则具有理想主义色彩,它是面向对象设计的终极目标。因此,针对开闭原则的实现方法,一直都有面向对象设计的大师费尽心机,研究开闭原则的实现方式。后面要提到的里氏代换原则(LSP)、依赖倒转原则(DIP)、接口隔离原则(ISP)、以及抽象类(Abstract Class)、接口(Interface)等等,都可以看做是开闭原则的实现方法。

 

Thinking

开闭原则比较典型的应用一个是抽象类,一个是接口。

举例接口如下:

定义一个访问数据库的接口DataBaseJDBC.java,其中定义了连接数据库的方法,访问数据库的方法

public interface DataBaseJDBC{

public String Conn();

 

public String search();

 

}

 

现在是用Mysql,

具体实现类:

public class DataBaseJDBCMysql implements DataBaseJDBC{

public String Conn(){

.....//具体实现Mysql

}

 

public String search(){

.......//具体实现Mysql

}

 

}

 

调用数据库服务的时候,调用方法为:

DataBaseJDBC DbJDBC=new DataBaseJDBCMysql();

访问为:

DbJDBC.conn();

DbJDBC.search();

 

后来公司要上市,决定烧钱了,于是改用oracle,这时候,对于实现类,显然需要增加访问oralce的类

public class DataBaseJDBCOracle implements DataBaseJDBC{

public String Conn(){

.....//具体实现oracle

}

 

public String search(){

.......//具体实现oracle

}

}

 

这时候,调用数据库的服务只需要改下面一句,将调用Mysql的类改为调用Oracle的类即可。

调用数据库服务的时候,调用方法为:

DataBaseJDBC DbJDBC=new DataBaseJDBCoracle();

在调用服务中,访问服务仍然为:

DbJDBC.conn();

DbJDBC.search();

 

在这里,牵扯出两个问题,一个是不同数据库需要的访问参数可能不同,返回值可能不同,怎么办?

一个是有没有更简单的办法,调用数据库的服务都不需要改,因为一个项目中可能会有很多调用数据库服务的地方,如果调整,都需要调整。

 

对于第二个问题,后续在讲Spring基础时再说。这个是很多框架考虑的一个方面。

 

对于第一个问题,这个就是考验设计者的经验和能力的东西了。这就是在文章中提到的,设计时要根据实际需求考虑扩展性。例如传递参数的问题,可以考虑传递参数的通用性,这又是更细致层面的开闭原则。例如,入参和出参可以用Map来实现,避免实际的参数类型不匹配,在访问数据库的类内部再根据不同的数据库分别解析。

 

现在能想到的开闭原则,有几个应用场景:

1、接口

2、抽象类

3、公共方法,即项目中公共的服务单独出来。例如访问数据库的方法,调用其他系统的方法。

4、业务逻辑与非业务逻辑分开。

5、系统之间调用,采用接口调用。

 

此外,将系统中的公共方法,包括基础公共方法和业务逻辑公共方法都封装为原子方法,也是开闭原则很好的实现。

 

最后,还想考虑就是过度设计的问题以及过度封装导致性能的问题。由于对开闭原则本身理解都不深入,待深入了解后再来考虑这些问题。

 

分享到:
评论

相关推荐

    JAVA开闭原则

    JAVA开闭原则是一种重要的软件设计思想,其核心理念在于提高软件系统的灵活性、稳定性和可维护性。开闭原则强调“对扩展开放,对修改关闭”,即在设计阶段应该确保软件模块能够在不修改原有代码的基础上,通过扩展的...

    什么是开闭原则,java开闭原则

    开闭原则是面向对象设计的核心原则之一,它的全称是"对扩展开放,对修改关闭",即在软件设计过程中,我们希望系统能够容易地添加新功能,同时保持原有代码的稳定性,避免频繁修改。这一原则由 Bertrand Meyer 在他的...

    面型对象设计原则——开闭原则(OCP)的Demo+静态结构图

    开闭原则(Open-Closed Principle,简称OCP)是面向对象设计中的一个核心原则,它在软件工程领域具有举足轻重的地位。该原则由 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出,旨在提高...

    JAVA设计模式之设计原则 ---开闭原则源码

    开闭原则是面向对象设计中的一个核心原则,它在JAVA设计模式中占据着重要的地位。这一原则由格里·贝斯提出,旨在指导开发者如何设计可维护和可扩展的软件系统。开闭原则(Open-Closed Principle,OCP)的核心思想是...

    开闭原则----图片缓存

    开闭原则是面向对象设计中的一个基本原则,它由软件工程专家 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出。这个原则的核心思想是“对扩展开放,对修改关闭”。简单来说,就是模块应该...

    设计模式6大原则:开闭原则

    设计模式6大原则:开闭原则

    开闭原则1

    开闭原则是面向对象设计的基本原则之一,由勃兰特·梅耶在1988年提出。这个原则的核心思想是:软件实体(如模块、类、接口和方法)应该对扩展开放,对修改关闭。这意味着在需求变更时,我们可以通过增加新代码来扩展...

    该怎么使用Java设计模式编程中的OCP开闭原则?.pdf

    该怎么使用 Java 设计模式编程中的 OCP 开闭原则? 在软件开发中,开闭原则是面向对象设计中最基础的设计原则之一,它指导我们如何建立稳定灵活的系统。开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放...

    开闭原则OCP.zip

    开闭原则(Open-Closed Principle,简称OCP)是软件设计模式中的一个基本原则,由艾兹格·迪米特里斯·伯纳斯-李提出。这个原则指出,软件实体(类、模块、函数等)应当对扩展开放,对修改关闭。换句话说,当软件...

    python开闭原则.docx

    **开闭原则** 是面向对象设计的一个核心原则,它的主要思想是软件实体(如类、模块、函数等)应当对扩展开放,对修改关闭。这一原则的目的是在系统需要新增功能或修改现有功能时,尽可能地减少对原有代码的改动,以...

    该怎么使用Java设计模式编程中的OCP开闭原则?.docx

    Java 设计模式中的 OCP 开闭原则 在软件设计中,OCP 开闭原则是其中一个非常重要的设计原则。该原则定义了一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。也就是说,当软件需要变化时,应该尽量通过...

    Java Web设计模式之OCP(开闭原则)

    开闭原则(Open-Closed Principle,OCP)是软件工程中的一个基本原则,由Bertrand Meyer在1988年提出,它是面向对象设计的核心之一。这个原则规定了软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这...

    论开闭原则在JAVA程序设计中的应用.pdf

    开闭原则是面向对象设计中的一个核心原则,它要求软件实体(例如类、模块、函数等)应该设计成对扩展开放,对修改关闭。这个原则由Bertrand Meyer在1988年提出,旨在确保软件系统能够更容易地应对需求的变化,从而...

    11丨软件设计的开闭原则:如何不修改代码却能实现需求变更?.pdf

    开闭原则是面向对象设计中的一个基本原则,它指导着我们如何设计出可维护、可扩展的软件系统。根据开闭原则,软件实体如模块、类或函数应当对扩展开放,对修改关闭。这意味着当需求发生变化时,我们应当尽可能地通过...

    论开闭原则在JAVA程序设计中的应用.zip

    开闭原则是面向对象设计的基本原则之一,由格里·贝迪奇在其著作《设计模式:可复用面向对象软件的基础》中提出。这个原则主张软件实体(类、模块、函数等)应当对扩展开放,对修改关闭。简单来说,就是在不修改原有...

    开闭原则.rar之java设计模式

    开闭原则是面向对象设计中的一个基本原则,它主张软件实体(包括类、模块、函数等)应当对扩展开放,对修改关闭。这意味着在不改变原有代码的基础上,可以通过增加新的功能来适应需求的变化,从而提高软件的可维护性...

    开闭原则和依赖倒置的例子Java.doc

    开闭原则(Open-Closed Principle,OCP)是软件设计原则之一,它的核心思想是软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着在不修改原有代码的基础上,可以通过增加新的代码来扩展功能。在这个...

    读书笔记:单例原则最小知识原则开闭原则.zip

    读书笔记:单例原则最小知识原则开闭原则

    读书笔记:设计原则开闭原则.zip

    读书笔记:设计原则开闭原则

Global site tag (gtag.js) - Google Analytics