面相对象开发的原则

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

相关文章

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

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选择的优