java设计模式:面向对象设计的7个原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据7条原则来开发程序,从而提高软件开发效率,节约软件开发成本和维护成本。

这7条原则分别是:开闭原则里氏替换原则依赖倒置原则单一职责原则接口隔离原则迪米特法则合成复用原则

接下来是对这7个原则的详细介绍。

开闭原则(OCP,Open Closed Principle)

定义

开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。

当应用的需求发生改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。

这里的软件实体包含几个部分:项目中划分出的模块、类和接口、方法。

作用

开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适用性和灵活性的同时具备稳定性和延续性。

对软件测试的影响

软件遵循开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码依然能够正常运行。

可以提高代码的可复用性

粒度越小,被服用的可能性就越大;在面向对象的程序设计中,根据原则和抽象编程可以提高代码的可复用性。

可以提高软件的可维护性

遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。

实现方法

可以通过【抽象约束、封装变化】来实现开闭原则,即通过接口或抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。

因为抽象灵活性好,适应性广,只要抽象得合理,可以基本保持软件架构的稳定,而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化的时候,只需要根据需求重新派生一个实现类来扩展就可以了。

里氏替换原则(LSP,Liskov Subsititution Principle)

定义

里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。

里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原则是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。

作用

里氏替换原则是实现开闭原则的重要方式之一。

里氏替换原则克服了继承中重写父类造成的可复用性变差的缺点。

里氏替换原则是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。

实现方法

里氏替换原则通俗地来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说,子类继承父类时,除了添加新的方法完成新增功能外,尽量不要重写父类的方法。

如果通过重写父类的方法来完成新的功能,这样写起来虽然简单,但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的概率会非常大。

如果程序违背了里氏替换原则,则继承类的对象在基类出现的地方会出现运行错误。这时其修正方法是:取消原来的继承关系,重新设计它们之间的关系。

关于里氏替换原则的例子,最有名的是【正方形不是长方形】。当然,生活中也有很多类似的例子,例如,企鹅、鸵鸟和几维鸟从升叙血的角度来划分,它们属于鸟类,但是从类的继承关系来看,由于它们不能继承鸟类会飞的功能,所以它们不能定义成鸟类的子类。同样的,由于气球鱼不会游泳,也不能够被定义成会游泳的鱼类的子类。

原文地址:https://www.cnblogs.com/yanggb/p/10352910.html

时间: 2024-07-30 13:42:01

java设计模式:面向对象设计的7个原则的相关文章

设计模式-面向对象设计原则

七种常用的面向对象设计原则 单一职责原则(Single Responsibility Principle,SRP): 一个类只负责一个功能领域中的相应职责. 开闭原则(Open-Close Principle,OCP): 软件实体应对外扩展开放,而对修改关闭. 里氏代换原则(Liskov Substitution Principle,LSP): 所有引用基类对象的地方能够透明的使用其子类的对象. 依赖倒换原则(Dependence Inversion Principle,DIP): 抽样不应该依

【设计模式】#001 面向对象设计的八个原则

1.对于面向对象的软件系统设计来说,在支持可维护性的同事,需要提高系统的可复用性 2.软件的复用可以提高软件的开发效率,提高软件的质量,节约开发成本,恰当的复用还可以改善系统的可维护性 3.面向对象设计简化成三条 3.1 封装变化点 3.2 对接口编程 3.3 多使用组合,少使用继承 点击查看大图:

面向对象设计的11个原则

单一职责原则(The Single Responsibility Principle,简称SRP) 开放-封闭原则(The Open-Close Principle,简称OCP) Liskov替换原则(The Liskov Substitution,简称LSP) 依赖倒置原则(The Dependency Inversion Principle,简称DIP) 接口隔离原则(The Interface Segregation Principle,简称ISP) 重用发布等价原则(The Reuse-

设计模式——面向对象设计原则

设计原则名称 设计原则简介 重要性 单一职责原则 类的职责要单,不能将太多的职责放在一个类中 四颗星 开闭原则 软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能 五颗星 里氏替换原则 在软件系统中一个可以接受基类对象的地方必然可以接受一个子类对象 四颗星 依赖倒转原则 要针对抽象层编程,而不要针对具体类编程 五颗星 接口隔离原则 使用多个专门的接口来取代一个统一的接口 两颗星 迪米特法则 一个软件实体对其它实体的引用越少越好,或者说如果两个类不必彼此直接通信,

Java与面向对象设计

1面向对象与面向过程 2.OO的特点 (1)封装性 (2)继承性 (3)多态性 3.Class and Object (1)define a class (2)gloables and local variables (3)constructor's defination and application (4)create an object declration an object allocate memory (5)use an object use the member variable

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

在没有了解到面向对象设计的7大原则前,我只是一只豆子!   但豆子终将会成长不是吗? 1.开闭原则:一个软件实体应当对扩展开放,对修改关闭.也就是说在所涉及一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为. 在开闭原则的定义中,软件实体可以指一个软件模块.一个由多个类组成的局部结构或一个读库的类. 抽象化是开闭原则的关键. 是添加新代码完成方法的重构  而不是修改源代码 声明: 本文源自 2.依赖倒转原则:高层模块不应该依赖低层模块,他们

java设计模式概述

1.1 什么是设计模式 Christopher Alexander说过:"每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动" 一般而言,一个模式有四个基本要素: 1. 模式名称(pattern name) 一个助记名,它用一两个词来描述模式的问题.解决方案和效果.模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果.找到恰当的模式名也是我们设计模式编目工作的难点之一. 2. 问题(problem)

Java程序员应该了解的10个面向对象设计原则

面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator.Observer这样的设计模式,而不重视面向对象的分析和设计.甚至还有经验丰富的Java程序员没有听说过OOPS和SOLID设计原则,他们根本不知道设计原则的好处,也不知道如何依照这些原则来进行编程. 众所周知,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计.查看Ap

(转载)Java程序员应当知道的10个面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的分析和设计上面.学习面向对象编程像"抽象"."封装"."多态"."继承" 等基础知识是重要的,但同时为了创建简洁.模块化的设计,了解这些设计原则也同等重要.我经常看到不同经验水平的java程序员,他们有的不知