面相对象开发的原则

2023-12-14 07:01
文章标签 开发 对象 原则 面相

本文主要是介绍面相对象开发的原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、开闭原则

        对修改关闭,对扩展打开。

2、里氏替换原则

        子类继承父类的方法时,不可重写父类的方法。

        如果重写了父类的方法会导致整个继承体系比较差,特别是运用多态比较平凡时,程序运行出错概率较大。

        如果出现了违背“里氏替换原则”替换原则,需要重新设计类之间的关系。

3、依赖倒转原则

        高层模块不应该依赖底层模块,两者应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。

        核心思想:面相接口编程,不面向实现编程。

依赖倒置原则的实现方法依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。

(1)每个类尽量提供接口或抽象类,或者两者都具备。

(2)变量的声明类型尽量是接口或者是抽象类。

(3)任何类都不应该从具体类派生。

(4)使用继承时尽量遵循里氏替换原则。

一个例子:

package principle;
public class DIPtest {public static void main(String[] args) {Customer wang = new Customer();System.out.println("顾客购买以下商品:");wang.shopping(new ShaoguanShop());wang.shopping(new WuyuanShop());}
}
//商店
interface Shop{public String sell(); //卖
}
//韶关网店
class ShaoguanShop implements Shop {public String sell(){return "韶关土特产:香菇、木耳……";}
}
//婺源网店
class WuyuanShop implements Shop{public String sell(){return "婺源土特产:绿茶、酒糟鱼……";}
}
//顾客
class Customer{public void shopping(Shop shop){ //购物System.out.println(shop.sell());}
}

4、单一职责原则(也适用于方法)

        单一职责原则规定一个类有且仅有一个引起它变化的原因。

        一个类承担了太多职责会有以下缺点:

        (1)一个职责发生变化时可能会抑制或削弱其他职责

        (2)当用户只需要类的每一个职责时又不得不把其他的职责引入进来,从而造成代码冗余。

        单一职责的有点:

        (1)降低类的复杂度,提高可读性。

        (2)提高系统的可维护性

        (3)引发风险变低

单一职责原则是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,再封装到不同的类或模块中。而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。

5、接口隔离原则

        要为各个类建立他们需要的专用接口,而不是试图建立一个很庞大的接口共所有依赖的类使用。

6、迪米特法则

        如果两个类无需直接通信,那么就不应该出现直接互相调用,可以通过第三方转发该调用。

只有当两个对象不存在关联,聚合和组合关系时就需要考虑使用迪米特法则。

使用这个法则会产生中介类,如果过多使用这个法则就会产生大量的中介类,会增加系统的复杂性。

用一个例子说明一下:

明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,其类图如图所示。

7、合成复用原则

该原则要求在软件开发过程中,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑继承关系来实现。如果要使用继承关系来实现,那么必须遵循里氏替换原则。

先看一个使用类继承的UML类图

使用了合成复用原则:

总结:

开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。

这篇关于面相对象开发的原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/491578

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使