架 软考架构师知识库 系统架构设计师 · 课件全文检索
已就绪 127 份课件 1966 页

面向对象设计原则

第十三章-面向对象设计 · 8 页 · 2166 字 录播 讲义

面向对象设计原则

项目 内容
来源 录播
章节 第十三章-面向对象设计
标签 讲义
页数 8
总字数 2166
原始课件 基础录播课/第十三章-面向对象设计/面向对象设计原则.pdf

本文由课件自动整理,页内文字按原始讲义阅读顺序还原;[图] 表示该位置存在图示,

图示内容请对照原始课件查看。


目录


第 1 页 · N E W P L A N

软件高级架构师

一

段

新

征

程

第 2 页 · 使用频

设计原则名称

定义

率

单一职责原则

★★★★

一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中

(Single Responsibility Principle, SRP)

☆

开闭原则

★★★★

软件实体应当对扩展开放,对修改关闭

(Open-Closed Principle, OCP)

★

里氏代换原则

★★★★

所有引用基类的地方必须能透明地使用其子类的对象

(Liskov Substitution Principle, LSP)

★

依赖倒转原则

高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖

★★★★

(Dependence Inversion Principle, DIP)

于细节,细节应该依赖于抽象

★

接口隔离原则

★★☆☆

客户端不应该依赖那些它不需要的接口

(Interface Segregation Principle, ISP)

☆

合成复用原则

★★★★

优先使用对象组合,而不是继承来达到复用的目的

(Composite Reuse Principle, CRP)

☆

迪米特法则

每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本

★★★☆

(Law of Demeter, LoD)

单位密切相关的软件单位

☆

第 3 页 · (1)单一责任原则:

•这个原则就是让一个类只做一件事情,不要把太多的任务放在一个类里。这样做的好处是,当你需要修改某个功能时,

只需要关注一个类,而不用担心影响其他功能。

•举例:想象你正在开发一个学生管理系统。你有一个Student类,它负责存储学生的信息,比如姓名和年龄。你还有

一个StudentManager类,它负责管理学生的添加、删除等操作。这样,每个类只负责一个特定的责任。

•举例:想象你是一名学生。你每天要面对多门课程,每门课程都有不同的老师和作业。如果你把所有课程的笔记、作

业和书都放在一个文件夹里,当你需要找到特定课程的资料时会变得非常混乱。相反,如果你为每门课程都准备一个

专用的文件夹,你就能更轻松地管理和找到所需的信息。每个文件夹就代表了一个类,它们只负责一个特定的任务,

即存储与该课程相关的资料。

第 4 页 · (2)开放封闭原则:

•对修改封闭,对拓展开放。这个原则意味着你可以扩展现有的代码,但不需要修改已有的代码。你应该允许新功能的

添加,而不会影响到已经运行良好的功能。

•举例:假设你正在编写一个图形绘制软件,你有一个Shape类,代表各种形状。现在,你想添加一个新的形状,比如

三角形。你应该能够通过创建一个新的类(例如Triangle类),而不是修改已有的Shape类。

•举例:想象你是一名家庭主妇,你正在准备一顿丰盛的晚餐。你已经在规划中有一些菜肴,但客人可能会有特殊的饮

食要求。你可以轻松地加入一个新的菜肴或调整配方,而不会影响到你已经准备好的菜肴。这就是开放封闭原则,你

的晚餐计划是“封闭”的,因为已经准备好了,但你可以“开放”地添加新的菜肴,以满足不同的需求。

第 5 页 · (3)里氏替换原则:

•这个原则强调子类应该能够替换父类而不会影响程序的正确性。换句话说,你应该能够使用子类的实例来替代父类的

实例,而不引发错误。

•举例:假设我们有一个银行账户的基类BankAccount,它有一个方法deposit(double amount)用于存款。现在我们有一

个子类CheckingAccount,它继承自BankAccount,并且增加了一些特性,比如允许透支。在这个例子中,

CheckingAccount类遵守了里氏替换原则。因为子类可以直接使用父类的存款方法而不引起任何的问题。

第 6 页 · (4)依赖倒置原则:

•这个原则强调细节应该依赖于抽象,而不是相反。高层模块不应该直接依赖于低层模块的细节,而应该通过抽象进行

交互。

•举例:假设你正在开发一个电子商务平台。你有一个OrderProcessor类负责处理订单。而这个类不应该直接依赖于具

体的支付方式,而是依赖于一个抽象的PaymentGateway接口。这样,你可以轻松地更改支付方式,而不必修改

OrderProcessor。

•举例:想象你是一名旅行者,你需要租一辆车去探索一个城市。你不需要亲自去了解车子的每个零件如何工作,你只

需要知道如何使用它们。租车公司为你提供了一辆可用的车,而不是让你去修理引擎或更换轮胎。在这个例子中,你

是高层模块,租车公司是低层模块,你依赖于租车公司提供的抽象服务,而不是直接与车辆细节打交道。

第 7 页 · (5)接口分离原则:

•这个原则强调客户端不应该被强制依赖它们不需要的方法。接口应该只包含客户端需要的方法,避免造成冗余和不必

要的复杂性。

•举例:想象你正在设计一个媒体播放器。你应该根据功能拆分成不同的接口,如AudioPlayer和VideoPlayer。这样,

如果你只需要一个音频播放器,你就不会被迫实现视频播放相关的方法,从而遵循了接口分离原则。

•举例:假设你正在考虑加入一个运动俱乐部。你有多个选项可供选择,如游泳、篮球和瑜伽。不同的人有不同的兴趣,

你可能只想参加其中一种活动。运动俱乐部应该将这些活动分开成不同的项目,以便每个人只关注他们感兴趣的部分。

这样,你不需要强制自己参加所有的活动,而是可以选择与你有兴趣的活动接口。

第 8 页 · T H E E N D

功不唐捐,玉汝于成!

开

启

新

征

程