一 开闭原则
1 什么是开闭原则
开闭原则是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。
1988年,Bertrand Meyer在他的著作《Object Oriented Software Construction》中提出了开闭原则,它的原文是这样:“Software entities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。这句话说得略微有点专业,我们把它讲得更通俗一点,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。
2 如何实现开闭原则
实现开闭原则的关键就在于“抽象”。把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的。
我们在软件开发的过程中,一直都是提倡需求导向的。这就要求我们在设计的时候,要非常清楚地了解用户需求,判断需求中包含的可能的变化,从而明确在什么情况下使用开闭原则。
3 开闭原则能够带来什么好处
如果一个软件系统符合开闭原则的,那么从软件工程的角度来看,它至少具有这样的好处:
可复用性好。
我们可以在软件完成以后,仍然可以对软件进行扩展,加入新的功能,非常灵活。因此,这个软件系统就可以通过不断地增加新的组件,来满足不断变化的需求。
可维护性好。
由于对于已有的软件系统的组件,特别是它的抽象底层不去修改,因此,我们不用担心软件系统中原有组件的稳定性,这就使变化中的软件系统有一定的稳定性和延续性。
二 里氏代换原则
面向对象设计的重要原则是创建抽象化,并且从抽象化导出具体化。这个导出要使用继承关系和一个原则:里氏代换原则(Liskov Substitution Principle LSP)。
那么什么是里氏代换原则呢?有个严格的表述,绕口,不好记。还是比较白话的这个好记。说的是:一个软件实体如果使用的是一个基类的话那么一定适用于其子类,而且它察觉不出基类对象和子类对象的区别。也就是说,在软件里面,把基类都替换成它的子类,程序的行为没有变化。
三 依赖倒转原则
抽象不应该依赖于细节,细节应当依赖于抽象。
要针对接口编程,而不是针对实现编程。
传递参数,或者在组合聚合关系中,尽量引用层次高的类。
主要是在构造对象时可以动态的创建各种具体对象,当然如果一些具体类比较稳定,就不必再弄一个抽象类做它的父类,这样有画舌添足的感觉
依赖倒转原则
☆ 依赖倒转原则,要依赖于抽象,而不要依赖于具体实现。
ξ 8.3 依赖倒转原则
☆ 三种耦合关系
① 零耦合关系,如果两个类没有耦合关系,就称之为零耦合;
② 具体耦合,具体耦合发生在两个具体的类之间,经由一个类对另外一个具体类的直接引用造成的。
③ 抽象耦合关系,抽象耦合关系发生在一个具体类和一个抽象类之间,使用两个必须发生关系的类之间存在有最大的灵活性。
☆ 依赖倒转原则的另外一种表述是:
要针对接口编程,不要针对实现编程(Program to an interface, not an implementation)[GOF95]。同样,在处理类之间的耦合关系时,尽量使用抽象耦合的形式。
下图中左侧A和B为具体依赖关系,重构后如右图所示,变为抽象依赖:
☆ 里氏替换原则是依赖倒转原则的基础。
☆ 工厂模式、模板模式、迭代子模式都是对依赖倒转原则的体现。
四 迪米特原则
迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写为: LoD.
迪米特法则可以简单说成:talk only to your immediate friends。 对于面向OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。 迪米特法则不希望类直接建立直接的接触。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。 有兴趣可以研究一下设计模式的门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子。 值得一提的是,虽然Ian Holland对计算机科学的贡献也仅限于这一条法则,其他方面的建树不多,但是,这一法则却不仅仅局限于计算机领域,在其他领域也同样适用。比如,美国人就在航天系统的设计中采用这一法则。
分享到:
相关推荐
**OOP设计原则详解** 面向对象编程(Object-Oriented Programming,简称OOP)是一种流行的编程范式,它强调将数据和操作数据的方法封装在一起,形成独立的对象。OOP设计原则是指导我们如何构建可维护、可扩展和可...
在OOP中,有四个基本原则,它们是设计高质量、可维护软件的基石。这四个原则分别是:开放封闭原则(Open-Closed Principle,OCP)、依赖倒置原则(Dependency Inversion Principle,DIP)、接口分离原则(Interface ...
以下将详细介绍OOP设计的关键概念和实践策略。 1. 封装:封装是OOP的基础,它将数据和操作这些数据的方法绑定在一起,形成一个独立的对象。通过设定访问修饰符(如public、private、protected),可以控制对象的...
此外,这个练习可能还会涵盖一些OOP设计原则,例如SOLID原则:单一职责原则(Single Responsibility Principle)、开闭原则(Open/Closed Principle)、里氏替换原则(Liskov Substitution Principle)、接口隔离...
4. 面向对象编程(OOP):系统采用OOP设计原则,如封装、继承、多态,使得代码结构清晰,易于理解和维护。例如,可能会有一个基类`EntityBase`,其他业务实体类如`Student`, `Teacher`等继承自它,实现共享的属性和...
Java23种设计模式和OOP5种设计原则,祝大家学习愉快。
面向对象编程(OOP)是现代软件开发中的基础,遵循一系列设计原则可以帮助我们构建更加稳定、可维护的系统。SOLID原则是OOP设计中最重要的五个原则,它们分别是: 1. 开闭原则(Open-Closed Principle,OCP):一个...
OOP设计原则包括单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则和迪米特法则。随着AOP(面向切面编程)的兴起,OOP与AOP相结合,可以更高效地处理横切关注点,如日志、事务管理等。 **第三...
源码提供了实现设备管理功能的详细代码结构,我们可以从中学习到很多关于OOP设计原则和实践的知识。 首先,面向对象编程是现代软件开发中的主流方法论,它以“对象”为核心,强调数据和操作数据的方法的封装。在这...
9. 算法与数据结构:结合OOP,实现一些基本的算法,如排序、查找等,或者使用OOP设计复杂的数据结构。 10. 综合应用:给出一个实际问题,要求设计并实现一个完整的OOP系统,综合运用以上知识点。 通过解答这些题目...
2. **六条OOP设计原则**:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则和迪米特法则,这些原则有助于创建更加健壮和可维护的系统。 3. **面向方面编程(AOP)的兴起**:AOP允许开发者将关注...
Java是一种广泛使用的支持OOP的编程语言,它提供了丰富的类库和工具来实现OOP设计原则。 1. **封装**:封装是OOP的基础,它隐藏了对象的内部细节,只对外提供公共接口。通过访问控制修饰符(如Java中的`private`、`...
总的来说,OOP三大原则是面向对象设计的基石,它们为我们提供了构建高质量、可维护软件的指导方针。通过深入理解和应用这些原则,开发者可以设计出更加灵活、可扩展的代码结构,提高软件的可复用性和可维护性,从而...
##### 2.2 六条OOP设计原则 这些原则旨在指导开发者如何更好地组织代码,以提高软件的质量: 1. **单一职责原则**:一个类应该只有一个引起它变化的原因。 2. **开放封闭原则**:软件实体应该是可扩展的,但不可修改...
8. **面向对象设计原则**:GooleEye源码将遵循一些OOP设计原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP),以实现可扩展和可维护的代码。...
这些文件名揭示了一个关于C++编程的系列课程,主要涵盖了面向对象编程(Object-Oriented Programming, OOP)的关键概念。...学习者可以通过这些PPT了解和掌握C++的OOP设计原则,从而更好地进行程序开发。
在这个讲座中,我们可能会学到如何在C++中设计和实现一个学生管理系统,包括如何创建表示学生、课程和成绩的类,以及如何通过OOP设计原则使代码更易于理解和扩展。此外,论文可能会阐述如何将这些抽象概念与实际金融...
"图书管理程序"可能是一个示例项目,用来展示如何应用OOP设计原则来构建一个实际的应用。这个项目可能涉及到类的设计,如Book类(包含书名、作者等属性)和Library类(管理书籍集合,提供借阅、归还等方法)。通过...
11. **OOP设计原则**:包括单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则等,这些原则指导着良好的面向对象设计。 12. **接口(Interface)**:接口是完全抽象的类,仅包含常量和抽象方法。它允许实现多...
深入理解OOP设计原则,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。 3. **集合框架**:熟悉ArrayList、LinkedList、HashMap、HashSet等常用集合的内部实现和操作特性,了解并发容器如...