面向对象设计原则

1. 面向对象概念

        面向对象 是一种编程思想,面向过程是关注实现的步骤,每个步骤定义一个函数,调用函数执行即可。

        面向对象关注的是谁(对象)来执行,        把具有相同属性和行为的一类事物(对象)进行抽象成类,然后再通过类实例化出一个个具体的对象,使用的具体的对象。

类通常包含以下要素:

  • 成员变量(属性):描述对象特征的名词性数据(如nameage)。
  • 成员方法(行为):定义对象动作的动词性操作(如eat()run())。
  • 构造方法:用于初始化新创建对象的成员变量。

面向对象三大特征

封装

封装并非简单的代码包装,而是通过访问权限修饰符(如private)隐藏类中部分成员,仅通过特定公共方法(如getName()setName())访问私有成员,增强数据安全性和可控性。

示例代码:

private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }

继承

子类继承父类的成员和方法,提高代码复用性。子类可扩展父类功能或重写父类方法(方法覆盖)。例如:

class Animal { void eat() { System.out.println("Eating..."); } }
class Dog extends Animal { @Override void eat() { System.out.println("Dog eats bone"); } 
}

多态

同一对象在不同场景表现不同行为,通常通过父类引用指向子类对象实现。多态提升代码扩展性,符合开闭原则(对扩展开放,对修改关闭)。

示例代码:

public void feedAnimal(Animal animal) {animal.eat(); // 实际调用子类重写后的方法
}

抽象类与接口

抽象类

abstract修饰的类,通常位于类体系顶层。特点包括:

  • 不能直接实例化。
  • 可包含抽象方法(无具体实现)和具体方法。
  • 可定义成员变量和构造方法。

示例:

abstract class Shape {abstract void draw(); // 抽象方法void move() { System.out.println("Moving shape"); } // 具体方法
}

接口

特殊形式的抽象类,核心在于定义功能(抽象方法)。特点包括:

  • 仅能包含静态常量(public static final)和抽象方法(Java 8后允许默认方法)。
  • 需由子类实现所有抽象方法。

示例:

interface Flyable {void fly(); // 默认public abstract
}
class Bird implements Flyable {@Override public void fly() { System.out.println("Bird flying"); }
}

抽象类与接口的选择

  • 使用抽象类的场景:

    • 需要定义成员变量或构造方法。
    • 需提供部分具体方法实现。
    • 适用于类体系的共性抽象(如Animal作为基类)。
  • 使用接口的场景:

    • 仅需定义行为规范(如ComparableRunnable)。
    • 需要多继承能力(Java中类单继承,接口可多实现)。
    • 强调“契约”而非具体实现。

2. 学习面向对象设计原则好处

在复杂的程序设计时,如果没有好的设计,在后期扩展功能时就很麻烦.

所以好的设计原则,可以提升程序设计的水平(可复用性,可维护性/可扩展性

3. 七个原则 

单一职责原则

单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。

对于单一职责原则,可以理解为一个类只负责一个功能领域中的相应职责, 即一个类不要负责太多“杂乱”的工作。 在软件系统中,如果一个类承担的职责过多,就等于把这些职责耦合在一起, 一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。这种耦合会导致 脆弱的设计,当变化发生时设计或遭受到意想不到的破坏。

单一职责原则是实现高内聚、低耦合的指导方针.

以项目开发为例,如果项目组成员每个人的职责都很明确,可以专心开发自 己负责的模块,则项目成果的质量往往很高。相反,如果职责不清晰,分工就会 混乱


开闭原则

系统设计应对扩展开放,对修改关闭。新增功能时通过增加新类或模块实现,避免直接修改现有代码。例如,通过策略模式扩展支付方式,而非修改原有支付逻辑。


接口隔离原则

将庞大接口拆分为更细粒度的专用接口,避免强制实现类依赖不需要的方法。例如,将“用户操作”接口拆分为“登录接口”和“注册接口”,分别由不同类实现。


依赖倒置原则

高层模块不应依赖低层模块,双方应依赖抽象(如接口或抽象类)。例如,数据库访问层应依赖“数据仓库接口”,而非具体实现(如MySQL或Oracle)。


组合聚合复用原则

优先使用对象组合(has-a关系)而非继承(is-a关系)实现代码复用。例如,在汽车类中嵌入引擎对象,而非继承引擎类,避免继承链的复杂性。


里氏替换原则

子类必须能够替换父类且不影响程序正确性。若需重写父类方法,应将父类设计为抽象类。例如,鸟类中的“飞行”方法应抽象化,避免企鹅子类违背父类行为。


迪米特法则

减少对象间的直接交互,通过中间类(如“经纪人”)间接通信。例如,订单系统通过服务层调用库存模块,而非直接访问库存类的内部方法。

代码示例(依赖倒置原则):

// 抽象层
interface Repository {void saveData(String data);
}// 高层模块依赖抽象
class UserService {private Repository repository;UserService(Repository repository) { this.repository = repository; }void saveUser(String data) { repository.saveData(data); }
}// 低层实现
class MySQLRepository implements Repository {@Overridepublic void saveData(String data) { /* MySQL存储逻辑 */ }
}

 总结

        面向对象设计以类和对象为核心,通过封装隐藏细节、继承实现复用、多态增强扩展性,其七大设计原则包括:单一职责(一个类只做一件事)、开闭原则(扩展开放/修改关闭)、接口隔离(细化接口功能)、依赖倒置(面向抽象编程)、组合复用(优先组合而非继承)、里氏替换(子类可无缝替换父类)、迪米特法则(减少对象直接耦合),这些原则共同指导构建高内聚、低耦合、易维护的软件系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90959.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90959.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90959.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[附源码+数据库+毕业论]基于Spring Boot+mysql+vue结合内容推荐算法的学生咨询系统

摘要 随着互联网的普及,学生在学习和生活中面临着海量信息,如何高效获取有价值的内容成为亟待解决的问题。本文基于 Spring Boot 框架,结合内容推荐算法,设计并实现了一个学生咨询系统。系统采用 Spring Boot MyBatis MySQL Vu…

DeepSeek 微调实践:DeepSeek-R1 大模型基于 MS-Swift 框架部署 / 推理 / 微调实践大全

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》(跟我一起学人工智能)【陈敬雷编著】【清华大学出版社】 GPT多模态大模型与AI Agent智能体书籍本章配套视频课程【陈敬雷】 文…

python基础知识pip配置pip.conf文件

pip.conf一、 INI格式二、 级别三、 文件位置四、 加载顺序五、 常用一、 INI格式 配置文件可以更改pip命令行选项的默认值,这个文件是使用INI格式编写的。 INI格式 主要包含三个内容:1.节section 2.键值对 3.注释 [section1] key1 value1 \\注释 key2…

深入理解 Java JVM

文章目录📕1. JVM简介📕2. JVM运行流程📕3. JVM运行时数据区📕4. JVM类加载✏️4.1 类加载过程✏️4.2 双亲委派模型✏️4.3 破坏双亲委派模型📕5. JVM垃圾回收机制(GC机制)✏️5.1 判断死亡对象…

Linux内核高效之道:Slab分配器与task_struct缓存管理

前言 在Linux内核中,进程创建与销毁是最频繁的操作之一。想象一下:当系统每秒需要处理成百上千次fork()和exit()调用时,如何保证task_struct(进程描述符)的分配与释放既快速又不产生内存碎片?这就是Slab分配…

双esp8266-01之间UDP透传传输,自定义协议

使用AT模式的透传,串口打印的数据包含pd1,4,数据打印的数据不是直接将数据打印出来,包含了pd1,4,特殊字符,针对想要直接开机直接透传,打印数据且按照自主协议帧头的功能进行开发。1.server程序:/*************SERVER**…

BGP 路由优选属性(7)【MED】官方考试综合实验题【bgp】【acl】【ip-prefix】【route-policy】【icmp 环路】精讲

目录 一、MED 属性介绍 二、实验 2.1 实验目的 2.2 拓扑图 2.2 实验说明 2.3 配置脚本 2.4 验证配置 2.5 问题分析 2.7 题目需求解析 2.8 场景 1:只允许在 AS12 上操作 2.9 场景 2:只允许在 AS34 上操作 正文 一、MED 属性介绍 MED 全称 mu…

html-初级标签

一.浏览器能识别的标签 1.1 head标签里的编码和title <head><meta charset"UTF-8"><title>Title</title> </head>1.2 标题 <body><h1>Welcome to my website</h1><h2>Welcome to my website</h2><…

【八股消消乐】Kafka集群 full GC 解决方案

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本专栏《八股消消乐》旨在记录个人所背的八股文&#xff0c;包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

《Java Web程序设计》实验报告二 学习使用HTML标签、表格、表单

目 录 一、实验目的 二、实验环境 三、实验步骤和内容 1、小组成员分工&#xff08;共计4人&#xff09; 2、实验方案 3、实验结果与分析 4、项目任务评价 四、遇到的问题和解决方法 五、实验总结 一、实验目的 1、HTML基础知识、基本概念 2、使用HTML标签、表格进行…

jenkins使用Jenkinsfile部署springboot+docker项目

文章目录前言一、前期准备二、编辑构建文件二、Jenkins构建总结前言 前面使用Jenkinsfile部署了前端vue项目&#xff0c;接着学习Jenkinsfile部署springboot项目。 一、前期准备 已经安装好centos,并且安装了jenkins和docker。本地新建springboot并上传到gitee上。 二、编辑…

使用ESM3蛋白质语言模型进行快速大规模结构预测

文章目录ESM3介绍ESM3在线使用本地使用api批量预测ESM相较于AlphaFold的优势ESM3介绍 ESM3是由EvolutionaryScale&#xff08;前Meta团队&#xff09;开发的一款蛋白质大语言模型&#xff0c;于2025年以《用语言模型模拟 5 亿年的进化》为题正式发表在Science上 文章链接: htt…

PostgreSQL 时间/日期管理详解

PostgreSQL 时间/日期管理详解 引言 PostgreSQL是一款功能强大的开源关系型数据库管理系统&#xff0c;在时间/日期管理方面具有独特的优势。本文将详细介绍PostgreSQL中时间/日期数据类型及其相关功能&#xff0c;帮助读者更好地理解和应用时间/日期管理。 时间/日期数据类型 …

Agent篇

Agent包含哪些模块&#xff0c;实现了什么功能Agent 就像一个多功能的接口&#xff0c;它能够接触并使用一套工具。根据用户的输入&#xff0c;Agent会规划出一条解决用户问题的路线&#xff0c;决定其中需要调用哪些工具&#xff0c;并调用这些工具。Agent 大语言模型规划记忆…

利用 MySQL 进行数据清洗

利用 MySQL 进行数据清洗是数据预处理的重要环节&#xff0c;以下是常见的数据清洗操作及对应 SQL 示例&#xff1a;1. 去除重复数据使用 ROW_NUMBER() 或 GROUP BY 识别并删除重复记录。-- 查找重复记录&#xff08;以 user_id 和 email 为例&#xff09; WITH Duplicates AS …

【MySQL笔记】事务的ACID特性与隔离级别

目录1. 什么是事务&#xff1f;2. 事务的ACID特性&#xff08;重要&#xff09;3. 事务控制语法4. 隔离级别与并发问题1. 什么是事务&#xff1f; 事务&#xff08;Transaction&#xff09;是由一组SQL语句组成的逻辑单元&#xff0c;这些操作要么全部成功&#xff0c;要么全部…

Mock 数据的生成与使用全景详解

Mock 数据的生成与使用全景详解 在后端开发过程中,真实数据往往受限于业务进度、隐私保护或接口未完成等因素,无法及时获取。这时,Mock数据(模拟数据)就成为开发、测试、联调不可或缺的利器。本文将从Mock数据的意义、常用场景、主流工具、实战案例到最佳实践,带你全面掌…

HTML 标题标签

需求&#xff1a;在网页显示六级标题标签。代码&#xff1a;//需求&#xff1a;在网页显示六级标题标签。 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><h1>一级标题&l…

(限免!!!)全国青少年信息素养大赛-算法创意实践挑战赛小学组复赛(代码版)

选择题部分在 C 中&#xff0c;以下代表布尔类型的是&#xff08;  &#xff09;选项&#xff1a;A. double B. bool C. int D. char答案&#xff1a;B解析&#xff1a;C 中布尔类型的关键字为bool&#xff0c;用于存储逻辑值true或false。执行以下程序&#xff0c;输出的…

编译器优化——LLVM IR,零基础入门

编译器优化——LLVM IR&#xff0c;零基础入门 对于大多数C开发者而言&#xff0c;我们的代码从人类可读的文本到机器可执行的二进制文件&#xff0c;中间经历的过程如同一个黑箱。我们依赖编译器&#xff08;如GCC, Clang, MSVC&#xff09;来完成这项复杂的转换。然而&#x…