`
lhminjava
  • 浏览: 18536 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类

面向对象编程五大原则

阅读更多

单一职责原则SRP:Single Responsibility Principle
开放封闭原则OCP:Open-Close Principle
Liskov替换原则LSP:Liskov Substitution Principle
依赖倒置原则DIP:Dependency Invertion Principle
接口隔离原则ISP:Interface Separate Principle

 

在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。

1. 开闭原则(the Open Closed Principle OCP)

  一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程 设计方法的重要原则之一。
我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
图1是一个应用OCP生成的收音机类图的例子:



图1 OCP应用(收音机)

2. 替换原则 (the Liskov Substitution Principle LSP)

  子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。

  我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。这个例子有些牵强,一个能够反映这个原则的例子时圆和椭圆,圆是椭圆的一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。

  Liskov的相关图示见图2:



图2 Liskov 原则

  运用替换原则时,我们尽量把类B设计为抽象类或者接口,让C类继承类B(接口B)并实现操作A和操作B,运行时,类C实例替换B,这样我们即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。

3. 依赖原则 (the Dependency Inversion Principle DIP)

  在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。

  在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。

  面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口(见图-3)。

  为此,我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。



图3依赖原则图示

4. 接口分离原则(the Interface Segregation Principle ISP)

  采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。

  ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP,组件、类的可用性和移植性将大打折扣。

  这个原则的本质相当简单。如果你拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。

  图4展示了一个拥有多个客户的类。它通过一个巨大的接口来服务所有的客户。只要针对客户A的方法发生改变,客户B和客户C就会受到影响。因此可能需要进行重新编译和发布。这是一种不幸的做法。



图4 带有集成接口的服务类

  我们再看图-5中所展示的技术。每个特定客户所需的方法被置于特定的接口中,这些接口被Service类所继承并实现。

图5 使用接口分离的服务类设计

  如果针对客户A的方法发生改变,客户B和客户C并不会受到任何影响,也不需要进行再次编译和重新发布。

  以上四个原则是面向对象中常常用到的原则。此外,除上述四原则外,还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来,我们看到这些类在几何分布上呈现树型拓扑的关系,这是一种良好、开放式的线性关系、具有较低的设计复杂度。一般说来,在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系,它们反映的是较大的耦合度和设计复杂化。

 

分享到:
评论

相关推荐

    JR 精品文章 - 面向对象编程五大原则.htm

    JR 精品文章 - 面向对象编程五大原则.htm

    面向对象编程,OO设计的五大原则

    面向对象编程(Object-Oriented Programming,简称 OOP)是一种常用的软件开发方法,它通过将数据和处理数据的方法封装在类(Class)中,形成对象(Object),来模拟现实世界中的实体及其行为。OOP的核心在于其设计...

    程序员必备的七大面向对象设计原则

    下面是七大面向对象设计原则的总结: 一、开闭原则 开闭原则是面向对象设计中最重要的原则之一。它定义为:一个软件实体应当对扩展开放,对修改关闭。也就是说,在设计一个模块的时候,应当使这个模块可以在不被...

    c++ 面向对象设计五大原则

    C++ 面向对象设计五大原则是面向对象编程(OOP)中一个非常重要的概念,它们是单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。这五大原则是面向对象设计的基础,遵循这五大原则可以使我们...

    delphi面向对象编程思想

    为了更好地应用面向对象编程的思想,在设计系统时还需要遵循一定的设计原则,如: - **单一职责原则**:一个类应该只有一个改变的原因。 - **开放封闭原则**:软件实体应该是可扩展的,但不可修改。 - **里氏替换...

    戏说面向对象程序设计(C#版).pdf

    ### 面向对象程序设计(C#版)关键知识点总结 #### 一、面向对象思想的核心价值 **四大发明之活字印刷——面向对象思想的胜利** - **可维护性**:面向对象的设计使得程序更加易于维护。就像活字印刷中的每一个字符...

    JAVA面向对象编程_孙卫琴2.pdf

    #### 五、面向对象编程的优势 1. **提高代码的可维护性**:通过封装、继承和多态等机制,使得代码结构清晰,易于维护。 2. **增强代码的可重用性**:面向对象的设计原则鼓励代码的复用,减少了重复编码的工作量。 3...

    面向对象的三大特性五项原则

    ### 面向对象编程五大基本原则 除了三大特性之外,面向对象编程还遵循一系列基本原则,以提高软件的质量、可维护性和可扩展性。 #### 单一职责原则(SRP) 单一职责原则指出一个类应该只有一个引起它变化的原因。...

    C++面向对象程序设计-电子教案

    《C++面向对象程序设计-电子教案》是一个深入学习C++编程的重要资源,它涵盖了C++语言的核心概念、面向对象编程的基本原则以及实际应用。在本文中,我们将详细探讨C++面向对象编程的关键知识点,包括类与对象、封装...

    面向对象七大基本设计原则.pdf

    面向对象七大基本设计原则通常是指SOLID原则,它是一组面向对象设计的指导原则,旨在使软件更加可维护和可扩展。SOLID由以下五个原则组成: 1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该...

    电子书《面向对象程序设计与Java语言》(第0.1版)

    - **继承与多态性**:第七章探讨了继承机制以及多态性的概念,这些都是面向对象编程的重要特征。 - **接口与程序包**:第八章讲解了接口的作用以及如何使用程序包来组织代码。 3. **程序设计语言的高级内容**: ...

    面向对象的编程思想.rar

    面向对象编程(Object-Oriented Programming,简称OOP)源自于面向过程编程,但在很多方面超越了它,尤其是在大型项目开发中展现出强大的优势。 在面向对象编程中,我们关注的是“对象”而不是过程。对象是类的实例...

    C++面向对象程序设计习题解析与上机指导

    《C++面向对象程序设计习题解析与上机指导》是一本专为学习C++面向对象编程的学生设计的辅助教材。这本书旨在帮助读者深入理解C++的面向对象特性,包括类、对象、封装、继承、多态等核心概念,并通过一系列习题和...

    大学C++《面向对象程序设计I》所有实验报告

    在大学的《面向对象程序设计I》课程中,C++是一种重要的编程语言,因为它支持面向对象编程(OOP)的概念,这些概念包括封装、继承和多态性。本实验报告集合旨在帮助学生深入理解并实践这些核心原则。下面将详细讨论...

    C++面向对象程序设计 C++面向对象程序设计

    C++作为一种强大的编程语言,不仅继承了C语言的优点,还引入了许多高级特性,其中包括面向对象编程(OOP)这一核心概念。面向对象编程通过模拟现实世界中的对象及其交互方式来构建软件系统,这有助于创建更加模块化...

    面向对象程序设计B课程考核

    面向对象程序设计(Object-Oriented Programming, OOP)是一种编程范式,其核心思想是将现实世界中的事物抽象为“对象”,并通过这些对象来设计软件系统。面向对象的四大特性包括封装性、继承性、多态性和抽象性。 ...

    面向对象设计原则

    以上介绍的五种面向对象设计原则——单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则和开闭原则,都是面向对象编程领域中非常重要的指导思想。遵循这些原则可以帮助开发者构建出更加健壮、可维护和易于扩展...

Global site tag (gtag.js) - Google Analytics