面向对象的设计原则-类设计原则

面向对象设计中的类设计原则与实践 本章深入探讨了面向对象设计中的类设计原则和实践,包括如何给类赋予明确的目的,处理类与属性的关系,以及如何在关联和继承之间做出选择。同时,本章也强调了代码复用的重要性,指出不应该重新发明轮子,而应尽可能地利用现有的库和框架。此外,本章还提出了软件构建和发布的最佳实践,强调了代码审查和团队合作的重要性。 阅读详情
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">


1. 开闭原则(the Open Closed Principle OCP)

  一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。
我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现 (通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
图 1 是一个应用 OCP 生成的收音机类图的例子:
          
                                
图1 OCP应用(收音机)

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

2. 替换原则 (the Liskov Substitution Principle LSP)

  子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。

  我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。这个例子有些牵强,一个能够反映这个原则的例子是圆和椭圆,圆是椭圆的一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。

  Liskov的相关图示见图2:

                     

                              rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 图2 Liskov 原则


rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">      运用替换原则时,我们尽量把类B设计为抽象类或者接口,让C类继承类B(接口B)并实现操作A和操作B,运行时,类C实例替换B,这样我们即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。


rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

3. 依赖原则 (the Dependency Inversion Principle DIP)

  在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。

   rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。 rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

   面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口(见图-3)。  

为此,我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。

        

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

                          rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 图3依赖原则图示


4. 接口分离原则(the Interface Segregation Principle ISP)

  采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。

  ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP,组件、类的可用性和移植性将大打折扣。

  这个原则的本质相当简单。如果你拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。

  图 4 展示了一个拥有多个客户的类。它通过一个巨大的接口来服务所有的客户。只要针对客户 A 的方法发生改变,客户 B 和客户 C 就会受到影响。因此可能需要进行重新编译和发布。这是一种不幸的做法。
                 
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">                             rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 图 4 带有集成接口的服务类

    我们再看图-5中所展示的技术。每个特定客户所需的方法被置于特定的接口中,这些接口被Service类所继承并实现。
                   

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CtuxWang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

图5 使用接口分离的服务类设计


  如果针对客户A的方法发生改变,客户B和客户C并不会受到任何影响,也不需要进行再次编译和重新发布。

  以上四个原则是面向对象中常常用到的原则。此外,除上述四原则外,还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来,我们看到这些类在几何分布上呈现树型拓扑的关 系,这是一种良好、开放式的线性关系、具有较低的设计复杂度。一般说来,在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系,它们反映的是较大的 耦合度和设计复杂化。


                                                                        —— 转自 希赛网

从TTL到RS485:一颗CH342芯片搞定三种串口通信的硬件连接实战 本文详细介绍了CH342芯片在TTL、RS232和RS485三种串口通信模式下的硬件连接实战。通过精选的电路设计示例和配置技巧,展示了CH342在工业控制和智能硬件开发中的灵活应用,帮助开发者高效实现多协议通信,显著提升项目开发效率。 阅读详情

相关推荐

【论文速读】MLDT:基于开源大语言模型的复杂长时机器人任务规划多层次分解方法

—在数据驱动的人工智能技术领域,开源大语言模型(LLMs)在机器人任务规划中的应用是一个重要的里程碑。近期基于开源大语言模型的机器人任务规划方法通常利用大量的任务规划数据集来提升模型的规划能力。虽然这些方法展现出了一定的前景,但它们在处理复杂长时任务时存在困难,因为这类任务需要理解更多的上下文信息并生成更长的动作序列。本文提出多层次分解任务规划方法(MLDT)来解决这一局限性。该方法创新性地在目标级、任务级和动作级对任务进行分解,以应对复杂长时任务带来的挑战。

muyulingfengye的博客 1646

Java编程继承与多态练习题(继承、接口程序demo)

1.编写学生类和成绩类并测试 学生有姓名()和成绩(sGrade)信息,成绩有课程(sGrade)和分数(score)信息。学生类的showResult方法用于输出学生姓名、课程和成绩信息。编写学生类(Student)和成绩类(Grade)并测试。 思路:成绩和学生是学生有成绩的关系,即一个类中有另一个类的成分,所以用组合的方式来实现 /** * 先定义一个成绩类 */ class Grade{ private String course; private String score;

Pandafz的博客 4095

无线充电效率从75%到90%+:深入拆解LCC补偿网络如何成为电动汽车和智能车竞赛的‘稳压器’

本文深入探讨了LCC补偿网络如何显著提升无线充电效率至90%以上,成为电动汽车和智能车竞赛中的关键技术。通过分析LCC的三元件结构和双模式切换特性,揭示了其在负载突变和线圈错位情况下的稳定性优势,并展示了实际应用中的效率提升和产业化挑战。

weixin_42528191的博客 397

面向对象的设计原则---开闭原则(原出处:不详)

在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。 1. 开闭原则(the Open Closed Principle OCP)   一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机

JFans2008的专栏 750

基于Simulink的超级电容与锂电池混合储能协调控制仿真

摘要:本文介绍基于Simulink的光伏-混合储能系统(HESS)建模与仿真方法,通过超级电容和锂电池的协同控制实现功率平抑。系统采用直流耦合架构,利用一阶低通滤波法将总功率分解为低频(锂电池承担)和高频分量(超级电容承担),并设计SOC自平衡机制维持超级电容工作点。仿真结果表明,该方案可使锂电池电流波动降低62%,光伏功率波动率降至7.5%,有效延长电池寿命。文章详细展示了从主电路搭建、功率分配到闭环控制的完整实现步骤,为新能源系统储能优化提供实用参考。

amy_mhd的博客 136

1. 迈进 SAP UI5 开发世界的第一步 - Hello World

SAP UI5 是一个用于开发企业级 Web 应用的前端框架,基于 HTML 和 JavaScript. 作为教程的第一步,我们需要了解最基础的 HTML 知识。 请大家在电脑上任意新建一个文件夹,将其命名,比如我取的名称为 Walkthrough. 进入 Walkthrough 文件夹,再新建一个文件夹名叫 01,代表本教程的第一个步骤。 进入 01 文件夹,新建一个 webapp 文件夹。这个名称是 web 应用约定俗成所使用的,大家都倾向于用这个名称,当然你要是想用其他名称也没有问题。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 9005

面向对象编程的几个原则

1. 开闭原则(the Open Closed Principle OCP) 一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节...

LRC的专栏 326

STM32串口控制LED灯的亮灭

STM32中的串口控制LED灯的亮灭,分为两种方式,一种是直接发送数字0和1来控制灯的亮灭,另一种是通过发送字符串来控制。 我所使用的开发板主控芯片是STM32F401RET6,主频84MHz, 首先要进行串口的初始化: /* 函数功能:串口的初始化 函数名:Usart_Init 返回值:无 参数:u32 brr 备注: USART1_TXD->PA9 USART1_RXD->PA10 */ void Usart_Init(u32 brr) { float div; u16 div

博客 2万+

【设计模式】二、UML 类图与面向对象设计原则 之 UML概述

UML 概述

Shipley_Leo的博客 1572

智能汽车嘚啵嘚 --- 智能座舱第七稿:智能座舱的升级OTA

智能汽车嘚啵嘚 --- 智能座舱第七稿:智能座舱的升级OTA

Soly_kun的博客 414

100天精通Python(基础篇)——第3天:运算符全解析(算术运算符、比较运算符、逻辑运算符、赋值运算符及其优先级规则)

100天精通Python(基础篇)——第3天:运算符全解析(算术运算符、比较运算符、逻辑运算符、赋值运算符及其优先级规则)

努力让自己发光,对的人才能迎着光而来 14万+

UML类图与面向对象设计原则

1. 引言 从大一开始学习编程,到如今也已经有两年了。从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具。学习过程中也无意识的了解了一些所谓的设计模式,如今打算系统的学习。学习以书《设计模式的艺术——软件开发人员内功修炼之道/刘伟著》为主。 所谓设计模式,即是前人对某类相似问题的抽象给出的解决方案。书中给出了2...

dayin201608的博客 347

分布式锁特点、以及用python3实现redis分布式锁

以下是 Python3 实现 Redis 分布式锁的详细教程,包含代码示例、原理说明及最佳实践。

数据知道的博客 2万+

UML类图和面向对象设计原则

uml全称:Unified Modeling Language 一种为系统的产品进行说明、可视化和文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。

不会骑摩托的程序员不是好的摄影师 700

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

面向对象设计原则及类和类的关系

类和类的关系: 泛化关系:一个类继承另一个类      实现关系:一个类实现一个接口                             依赖关系:一个类是另一个类的局部变量或方法参数或返回类型。 关联关系:  聚合关系:一个类是另一个类的属性,是整体和部分关系。                       组合关系:一个类是另一个类的属性,是整体不可分割的一部分,强内聚

人之所能 是相信能 833

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

比较器、异常、类的关系、面向对象设计原则

1.比较器的概念 确定两个对象之间的大小关系及排列顺序称为比较,能实现这个比较功能的类或方法称之为比较器,在java中只有两种比较器。 2.比较器的分类 内部比较器(Comparable接口) public class Student implements Comparable{} 内部比较器只能有一个,一般采用最经常使用的比较规则 外部比较器(Comparator接口) 可指定多个 不需要Student实现该接口,而是定义专门的类 3.内部比较器的概念 简单点说就是把比较器写在类的内部

weixin_45290168的博客 372

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RYU+Mininet搭建SDN校园网:从环境部署到流表下发实战

软件定义网络(SDN)将控制平面与数据平面解耦,为网络架构的灵活编排提供了全新思路。控制器作为网络大脑,负责统一下发转发策略,而底层交换机仅执行匹配与转发动作。在众多开源方案中,Mininet凭借其轻量级的网络虚拟化能力,可在一台普通笔记本上模拟完整校园网络拓扑;RYU控制器则以其Python编写的简洁架构,成为学习和二次开发OpenFlow协议的理想选择。两者结合,能够完整体验从拓扑构建、控制逻辑编写到流表动态下发的工作流程。本文以校园网为应用场景,阐述分层拓扑设计、VLAN隔离策略及跨区域访问控制等典型

weixin_33901641的博客 281

面向对象的设计原则---类设计原则

面向对象的设计原则-类设计原则 在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。 1. 开闭原则(the Open Closed Principle OC

JFans2008的专栏 644

面向对象的设计原则-类设计原则(转载)

出处:CASI.cn作者:张华 在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。 1. 开闭原则(the Open Closed Principle OCP)  一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时

Figol's Blog 781
上一篇: 初识JSON(二)
下一篇: 海阔天空
Loadingo0
博客等级 码龄19年 53粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值