计算机oo设计原则
电子信息系统机房设计规范gb501742008

中华人民共和国国家标准电子信息系统机房设计规范Code for design of electronic information system roomGB 50174—2008主编部门:中华人民共和国工业和信息化部批准部门:中华人民共和国住房和城乡建设部施行日期:2009年6月1日中国计划出版社2009北京中华人民共和国国家标准电子信息系统机房设计规范GB 50174—2008中华人民共和国工业和信息化部主编中国计划出版社出版中华人民共和国住房和城乡建设部公告第161号关于发布国家标准《电子信息系统机房设计规范》的公告现批准《电子信息系统机房设计规范》为国家标准,编号为GB 50174-2008,自2009年6月1日起实施。
其中,第6.3.2、、、、条为强制性条文,必须严格执行。
原《电子计算机机房设计规范》GB 50174—93同时废止。
本规范由我部标准定额研究所组织中国计划出版社出版发行。
中华人民共和国住房和城乡建设部二oo八年十一月十二日前言本规范是根据建设部《关于印发“2005年工程建设标准规范制订、修订计划(第二批)”的通知》(建标函~号)的要求,由中国电子工程设计院会同有关单位对原国家标准《电子计算机机房设计规范》GB 50174—93进行修订的基础上编制完成的。
本规范共分13章和1个附录,主要内容有:总则、术语、机房分级与性能要求、机房位置及设备布置、环境要求、建筑与结构、空气调节、电气、电磁屏蔽、机房布线、机房监控与安全防范、给水排水、消防。
本规范修订的主要内容有:1.根据各行业对电子信息系统机房的要求和规模差别较大的现状,本规范将电子信息系统机房分为A、B、C三级,以满足不同的设计要求。
2.比原规范增加了术语、机房分级与性能要求、电磁屏蔽、机房布线、机房监控与安全防范等章节。
本规范中以黑体字标志的条文为强制性条文,必须严格执行。
本规范由住房和城乡建设部负责管理和对强制性条文的解释,由工业和信息化部负责日常管理,由中国电子工程设计院负责具体技术内容的解释。
OA系统设计的六大原则

OA系统设计的六大原则时至今日,OA软件借用范伟的话说是“有点乱,有点乱”,借用孔乙己的话说是“多乎哉,不多也”,为什么还不多呢?因为实际情况是OA太多,而好OA太少,要用数字说明,我想是5%不到。
如何分辨OA软件的优劣呢?日前,中国易用OA的创导者新思创提出了OA软件设计的六大原则,基本上包括了OA软件的性能指标,给项目开发和用户选型提供了有益的借鉴,相信用户和厂家的共同努力才能高中国OA软件的整体水平。
这六大原则是:1、实用性原则实用就是务实不务虚,就是注重解决实际问题,做精、做细核心功能,兼顾常用的辅助功能,实现快捷、方便地布署和使用,并节省投资,降低风险。
有的OA看起来功能一堆,什么客户、人事、财务、资产、知识管理等等一网打尽,却做得粗糙之极,中看不中用。
2、易用性原则这就要求软件的界面友好,结构清晰,流程合理,功能一目了然,菜单操作充分满足用户的视觉流程和使用习惯。
易理解、易学习、易使用、易维护、易升级,实现“傻瓜相机”式的操作,将实施、培训成本和周期降到最低。
易用性对软件的顺利实施和使用具有至关重要的意义,易用性的欠缺造成项目失败的案例已经屡见不鲜。
3、先进性原则OA是一个先进的工具,所以应采用先进的技术架构和设计方法,融合先进的管理思想,结构化程度高,灵活性、扩展性、兼容性、升级性好,速度快,符合技术发展趋势,适应用户成长需要。
此处需要注意的是避免受“惟技术论”和“惟概念论”的误导,无论是技术还是概念都要以适合自己为准。
4、稳定性原则OA融入到企业中后,就会让人产生很大的依赖性。
所以系统从底层数据库到功能层应经过严格测试,数据库稳定,功能顺畅,没有堵塞、丢失数据的现象,能在不同的硬件、网络、操作系统以及操作习惯中长期平稳运行,适合大规模用户使用,以保证日常办公的正常进行。
5、安全性原则OA系统往往保存有企业的核心资料,也会有个人用户的一些保密资料,这就要求系统能有效防止外部各种病毒攻击和恶意攻击,能够进行严格、细致的访问权限管理,内部数据具有多种备份方式。
ood概念

ood概念OOD(Object-Oriented Design,面向对象设计)是一种软件工程方法,旨在通过将系统划分为多个相互作用的对象来设计和构建复杂的软件系统。
该方法强调将问题领域的实体和行为模块化,并在系统中使用封装、继承和多态等特性来提高代码的可重用性、可扩展性和可维护性。
面向对象设计的核心概念包括类、对象、继承、封装、多态和关联关系。
首先,类是对象的模板,描述了对象的行为和属性。
对象是类的实例,具有特定的状态和行为。
继承是一种构建层次结构的机制,子类可以继承父类的行为和属性。
封装是将数据和方法包装在对象内部的机制,只有对象自身可以直接访问其内部状态。
多态允许不同的对象对相同的消息产生不同的行为。
最后,关联关系描述了对象之间的联系,如关联、聚合和组合等。
在OOD中,首先需要进行需求分析和问题建模。
通过分析问题领域中的实体和行为,可以识别出需要在系统中建模的类和对象。
然后,通过定义类的属性和方法来描述类的行为,使用关联关系将类连接在一起。
在这个过程中,需要考虑类之间的耦合和职责分配,确保系统的结构合理。
在实际的面向对象设计中,有几个重要的原则需要遵循。
其中之一是单一职责原则,即一个类只应该有一个责任。
这样可以提高类的内聚性,并使其更易于理解、扩展和维护。
另一个原则是开闭原则,即对扩展开放、对修改关闭。
通过使用接口和抽象类来实现,可以使系统易于扩展,并且对现有的代码进行最小干预。
此外,还有里氏替换原则,接口隔离原则和依赖倒置原则等,它们一起确保系统的可重用性、可扩展性和灵活性。
在进行面向对象设计时,还可以使用一些设计模式来解决通用的设计问题。
例如,工厂模式可以用于创建对象的过程抽象,单例模式可以确保一个类只有一个实例,观察者模式可以在对象之间建立松散的耦合关系等。
这些设计模式是根据已有经验总结出来的,可以帮助开发人员更好地解决一些常见的设计问题,并提高系统的设计质量。
总之,OOD是一种用于构建复杂软件系统的方法,通过将系统划分为多个对象、封装、继承和多态等特性来提高代码的可重用性、可扩展性和可维护性。
软件系统设计原则

软件系统设计原则1.单一职责原则:一个类应该只负责一项职责,在类的设计中应该尽量保持高内聚、低耦合,不将多个职责耦合在一个类中。
这样可以提高类的可复用性、可测试性和可维护性。
2.开放封闭原则:软件系统中的类、模块和函数应该对扩展开放,对修改封闭。
当需求发生变化时,应该通过新增代码来实现新功能,而不是修改已有的代码。
这样可以避免修改已有代码带来的风险,保证系统的稳定性和扩展性。
3.里氏替换原则:任何父类出现的地方,都可以用其子类替换。
子类应该继承父类的行为,并且不应该改变父类所期望的结果。
这样可以确保在使用多态时不会带来意外的结果,降低了系统的耦合性。
4.依赖倒置原则:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
具体的类尽量依赖于接口或抽象类,而不是依赖于其他具体类。
这样可以降低类之间的耦合性,提高系统的扩展性和维护性。
5.接口分离原则:使用多个具体的接口比使用一个总的接口要好。
一个类应该只依赖于其需要使用的接口,而不应该依赖于其他不需要的接口。
这样可以降低类之间的耦合性,提高代码的可复用性和可维护性。
6.迪米特原则:一个类应该尽量减少对其他类的依赖,即一个类不应该知道太多其他类的细节,只应该与其直接的朋友进行交流。
这样可以减少类之间的依赖关系,降低系统的耦合性,使得系统的模块更加独立和易于修改。
7.高内聚低耦合原则:模块内部的元素应该紧密相关,而模块之间的关系应该相对较弱。
高内聚指的是模块内的元素一起工作,完成一个明确的任务;低耦合指的是模块之间的相互依赖尽可能地少。
这样可以提高系统的可维护性、可测试性和可复用性。
8.组合优于继承原则:在设计时优先考虑使用组合关系,而不是继承关系。
组合关系可以灵活地组合对象,减少类之间的耦合性,提高系统的灵活性和扩展性。
继承关系容易造成类之间的紧耦合,且继承是一种静态的关系,无法动态修改。
总之,软件系统设计原则是指导软件架构设计和开发的一些基本准则,可以帮助开发人员提高软件系统的质量、可重用性和可维护性。
简述软件设计原理

简述软件设计原理
软件设计原理是指在软件开发过程中,为了保证软件系统的可扩展性、可重用性、可维护性、可靠性、安全性等方面的质量,需要遵循的一系列设计原则和方法。
常用的软件设计原理包括以下几个方面:
1. 单一职责原则(SRP)
这个原则是指一个类或者模块只应该负责一项任务。
这样可以保持代码的简洁性和易维护性。
2. 开放封闭原则(OCP)
这个原则是指一个软件实体应该对扩展开放,对修改封闭。
这样可以保证系统的扩展性,避免因修改而引入新的错误。
3. 里氏替换原则(LSP)
这个原则是指使用父类对象的地方可以使用子类对象替换,而不会影响程序的正确性。
这样可以保证代码的可重用性。
4. 依赖倒置原则(DIP)
这个原则是指高层模块不应该依赖低层模块,而是应该依赖于抽象接口。
这样可以保证系统的可扩展性和灵活性。
5. 接口隔离原则(ISP)
这个原则是指一个类不应该强迫其它类依赖它们不需要的接口。
这样可以避免代码的冗余和不必要的耦合。
6. 迪米特法则(LoD)
这个原则是指一个对象应该对其它对象保持最少的了解。
这样可以降低系统的耦合度和复杂度。
在实际开发中,软件设计原理是非常重要的,可以帮助开发人员避免常见的开发陷阱和错误,同时也可以提高代码的可读性、可维护性和可扩展性。
因此,软件设计原理是每一个软件工程师都应该掌握的基本技能。
智慧步行街智慧商圈OO解决方案

制定科学的恢复策略,包括恢复步 骤、恢复人员、恢复流程等,确保 系统在灾难后能够迅速恢复正常。
06
OO智慧商圈解决方案的实施 步骤和时间表
实施步骤与流程
01
02
03
04
05
需求分析与规 划
对智慧商圈的潜在需求进 行深入调研。
系统设计
根据需求分析结果,设计 系统架构、功能模块和数 据库结构。
本OO解决方案的总结与亮点
01
丰富的业务场景
02
强大的技术能力
本OO解决方案覆盖了智慧步行街智 慧商圈的多种业务场景,包括但不限 于商圈管理、会员管理、营销推广等 ,为商户提供全方位的业务支持。
本OO解决方案采用了先进的技术手 段和工具,包括大数据、人工智能、 云计算等,可有效提升商圈的运营效 率和客户体验。
智能停车模块
通过物联网技术实现车位信息实时 采集和共享,为消费者提供便捷的 停车服务。
智能导购模块
通过大数据分析和人工智能技术, 为消费者提供个性化的商品推荐和 导购服务。
智能安防模块
通过视频监控、人脸识别等技术, 实现商圈的安全监控和防范。
模块功能详细介绍
• 智慧商圈管理模块 • 商圈运营管理:支持多种支付方式,提高消费者购物便利性;智能分析客流数据,优化商铺布局;智能化
。 • 智能导购模块 • 商品推荐个性化:通过大数据分析消费者行为和喜好,为消费者推荐感兴趣的商品。 • 导购服务人性化:通过人工智能技术,为消费者提供专业的导购服务,解答购物疑问。 • 智能安防模块 • 视频监控:通过高清摄像头和智能分析技术,实现全天候的安全监控。 • 人脸识别系统:通过人脸识别技术,对陌生人进行监控和预警,确保商圈安全。
软件设计6大原则
软件设计6大原则软件设计的六大原则是一组指导性原则,有助于开发高质量、易维护和可扩展的软件系统。
这些原则有时被称为"SOLID"原则,其中"SOLID"是每个原则的首字母缩写。
以下是这六大原则:1.单一职责原则(Single Responsibility Principle - SRP):每个类或模块应该具有单一的职责,即一个类应该只有一个改变的理由。
这有助于确保代码的清晰性和可维护性。
2.开闭原则(Open/Closed Principle - OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
这意味着应该能够通过添加新的代码来扩展系统功能,而不是修改现有的代码。
3.里氏替换原则(Liskov Substitution Principle - LSP):子类应该能够替代其基类,而不会引发错误或破坏程序的正确性。
这确保了继承体系的正确性和一致性。
4.接口隔离原则(Interface Segregation Principle - ISP):不应该强迫客户端依赖它们不使用的接口。
接口应该小而专一,以满足特定的客户端需求。
5.依赖反转原则(Dependency Inversion Principle - DIP):高级模块不应该依赖于低级模块,两者都应该依赖于抽象。
此外,抽象不应该依赖于细节,细节应该依赖于抽象。
这鼓励使用依赖注入和接口来解耦组件。
6.迪米特法则(Law of Demeter - LoD):一个对象应该与其相关的直接朋友交互,而不应该与陌生的对象交互。
这有助于减少耦合性,提高系统的模块化程度。
这些原则在面向对象编程和软件设计中非常有用,有助于创建可维护、灵活和高质量的代码。
它们通常被视为良好的编程实践,有助于避免常见的设计缺陷和问题。
当软件工程师遵循这些原则时,他们更有可能开发出具有良好结构的软件系统。
GRASP设计模式
面向对象设计的原则指南–概要篇我们在进行面向对象设计(OOD)时应该怎样进行,遵循什么原则呢?我们或许听说过设计模式,那是针对特定的问题提出的特定的解决方法。
面向对象的设计从提出到现在经过很多人的经验和实践,也总结出了很多原则。
在设计开发中,如果能有意识地向这些原则靠拢,对我们的系统设计与开发会有很大的帮助,也是构筑具有稳定性,扩展性的系统的一个保障:- 是否遵守了那些基本原则- 如果违反了基本原则,是否存在合适的理由这些被大师们总结出来的基本原则包括了:1,类的设计原则2,包的设计原则2.1 包的内部关系方面(聚合性)的原则2.2 包之间的关系方面(耦合性)的原则类设计原则The Single Responsibility Principle (SRP) - OO设计的单一职责原则There should never be more than one reason for a class to change.永远不要让一个类存在多个改变的理由。
The Open-Closed Principle (OCP) - 面向对象软件设计的开闭原则Software entities (classes, modules, function, etc.) should be open for extension, but closed for m odification.软件实体(模块,类,方法等)应该对扩展开放,对修改关闭。
The Liskov Substitution Principle (LSP) - OO设计的里氏替换原则Functions that use pointers or references to base classes must be able to use objects of derived cl asses without knowing it.所有引用基类的地方必须能透明地使用其子类的对象。
系统总体设计原则
系统总体设计原则系统总体设计是指在软件开发过程中,对于系统架构的整体规划和设计。
系统总体设计的目标是从整体上把控系统的功能和性能需求,确保系统的可靠性、可扩展性、可维护性和安全性。
下面是系统总体设计的原则及详细说明。
1.单一职责原则单一职责原则是指一个类或模块应该只具备一项责任。
在系统总体设计中,每个模块应该只关注一个特定的功能或者业务需求,保证模块的可维护性和可扩展性。
2.开闭原则开闭原则是指软件实体应该对扩展开放,对修改关闭。
在系统总体设计中,通过建立抽象接口和基于接口的编程方式,使得系统可以方便地进行扩展和修改,减少对已有代码的修改。
3.接口隔离原则接口隔离原则是指客户端不应该依赖于不需要的接口。
在系统总体设计中,应该根据业务需求和功能模块的关系,合理划分接口,避免接口设计的冗余和僵化。
4.依赖倒置原则依赖倒置原则是指高层模块不应该依赖于底层模块,二者都应该依赖于抽象。
在系统总体设计中,通过使用接口作为两个层次之间的抽象,实现高层模块与底层模块之间的松耦合。
5.里氏替换原则里氏替换原则是指子类对象应该能够替换其父类对象,并且不影响程序的正确性。
在系统总体设计中,子类应该继承父类的抽象行为,但可以有自己特定的实现。
6.迪米特法则迪米特法则是指一个对象应该对其他对象有尽可能少的了解。
在系统总体设计中,模块之间的耦合应该尽量减少,每个模块只关注自己的职责和与外界的交互。
7.好莱坞原则8.最小知识原则最小知识原则是指一个对象或者模块应该尽可能地少与其他对象或者模块发生直接的相互作用。
在系统总体设计中,模块之间的交互应该尽量减少,避免过于复杂的依赖关系。
9.安全性原则在系统总体设计中,安全性是非常重要的一项要求,系统应该能够保护用户的数据和隐私,防止恶意的攻击和非法的访问。
10.可扩展性原则可扩展性是指系统应该能够方便地进行功能扩展和业务拓展,以适应不断变化的需求。
在系统总体设计中,应该预留出接口和扩展点,使得后续的扩展和升级变得更加容易。
SOLID设计原则
SOLID设计原则写了这么多年代码,你真的了解SOLID吗?尽管⼤家都认为SOLID是⾮常重要的设计原则,并且对每⼀条原则都⽿熟能详,但我发现⼤部分开发者并没有真正理解。
要获得最⼤收益,就必须理解它们之间的关系,并综合应⽤所有这些原则。
只有把SOLID作为⼀个整体,才可能构建出坚实(Solid)的软件。
遗憾的是,我们看到的书籍和⽂章都在罗列每个原则,没有把它们作为⼀个整体来看,甚⾄提出SOLID原则的Bob⼤叔也没能讲透彻。
因此我尝试介绍⼀下我的理解。
先抛出我的观点: 单⼀职责是所有设计原则的基础,开闭原则是设计的终极⽬标。
⾥⽒替换原则强调的是⼦类替换⽗类后程序运⾏时的正确性,它⽤来帮助实现开闭原则。
⽽接⼝隔离原则⽤来帮助实现⾥⽒替换原则,同时它也体现了单⼀职责。
依赖倒置原则是过程式编程与OO 编程的分⽔岭,同时它也被⽤来指导接⼝隔离原则。
关系如下图:单⼀职责原则(Single Responsibility Principle)单⼀职责是最容易理解的设计原则,但也是被违反得最多的设计原则之⼀。
要真正理解并正确运⽤单⼀职责原则,并没有那么容易。
单⼀职责就跟“盐少许”⼀样,不好把握。
Robert C. Martin(⼜名“Bob⼤叔”)把职责定义为变化原因,将单⼀职责描述为 ”A class should have only one reason to change." 也就是说,如果有多种变化原因导致⼀个类要修改,那么这个类就违反了单⼀职责原则。
那么问题来了,什么是“变化原因”呢?利益相关者⾓⾊是⼀个重要的变化原因,不同的⾓⾊会有不同的需求,从⽽产⽣不同的变化原因。
作为居民,家⽤的电线是普通的220V电线,⽽对电⽹建设者,使⽤的是⾼压电线。
⽤⼀个Wire类同时服务于两类⾓⾊,通常意味着坏味道。
变更频率是另⼀个值得考虑的变化原因。
即使对同⼀类⾓⾊,需求变更的频率也会存在差异。
最典型的例⼦是业务处理的需求⽐较稳定,⽽业务展⽰的需求更容易发⽣变更,毕竟⼈总是喜新厌旧的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图2 打印输出的设计2
二、 Liskov替换原则 替换原则
Liskov替换原则最早是由 Liskov于 1987 年在 替换原则最早是由 于 OOPSLA 会议上提出来的[ Lis88],这个原则指的是子 会议上提出来的[ ],这个原则指的是子 ], 类可以替换父类出现在父类能出现的任何地方。 类可以替换父类出现在父类能出现的任何地方。如图 3所 所 示是Liskov替换原则的图示说明。 替换原则的图示说明。 示是 替换原则的图示说明
尽量减少消息模式的数目。只要可能, 尽量减少消息模式的数目。只要可能,就使消息具有 一致的模式,以利于理解。例如,不要在一个消息中, 一致的模式,以利于理解。例如,不要在一个消息中, 地址, 其第一个参数表示消息发送者的 URL 地址,而在另一 个消息中, 个消息中,是最后一个参数表示消息发送者的 URL 地 址。 设计简单的类。类的职责要明确, 设计简单的类。类的职责要明确,不要在类中提供太 多的服务,应该从类名就可以较容易地推断出类的用途。 多的服务,应该从类名就可以较容易地推断出类的用途。
考虑如下图的设计: 考虑如下图的设计:
图1 打印输出的设计1
Hp 类、Epson 类、Canon 类分别表示不同类型的 打印机, 打印机,Output类与这 3 个类都有关联。系统运行时, 类与这 个类都有关联。系统运行时, Output类根据当前与系统相连的是哪种类型的打印机而 类根据当前与系统相连的是哪种类型的打印机而 ()方法 分别使用不同类中的 print()方法。显然在 Output类 ()方法。 类 中会有复杂的 if...else(或 switch...case)之类的分支结 ( ) 构来判断当前与系统相连的是哪种类型的打印机。 构来判断当前与系统相连的是哪种类型的打印机。这是 一种不好的设计, 一种不好的设计,因为如果将来系统要增加一种新的打 印机类型, 打印机, 印机类型,例如 Legend 打印机,则不但要增加一个新 类的内部结构。 的 Legend 类,还要修改 Output类的内部结构。 类的内部结构
设计, 对于 OO 设计,主要是要求系统的设计结果要 能适应系统新的需求变化,一旦需求发生变化, 能适应系统新的需求变化,一旦需求发生变化, 整个系统不用做变动或做很少的变动就可以满足 新的需求。 新的需求。 OO 设计的几条原则: 设计的几条原则:
◎ ◎ ◎ ◎
开闭原则( 开闭原则(Open/Closed Principle,OCP) , ) Liskov替换原则(Liskov SubstitutioPrinciple,LSP) 替换原则( 替换原则 , ) 依赖倒置原则( 依赖倒置原则(Dependency Inversion Principle,DIP) , ) 接口分离原则( 接口分离原则(Interface Segregation Principle,ISP) , )
在结构化设计中,高层的模块依赖于低层的模块。 在结构化设计中,高层的模块依赖于低层的模块。图 4 主程序会依赖于模块1、 中,主程序会依赖于模块 、模块 2、模块 3,而模块 1 又依 、 , 赖于模块 11、模块 12,等等。在结构化设计中,越是低层 、 ,等等。在结构化设计中, 的模块,越跟实现细节有关,越是高层的模块越抽象, 的模块,越跟实现细节有关,越是高层的模块越抽象,但高 层的模块往往是通过调用低层的模块实现的。也就是说, 层的模块往往是通过调用低层的模块实现的。也就是说,抽 象的模块要依赖于与具体实现有关的模块, 象的模块要依赖于与具体实现有关的模块,显然这是一种不 好的依赖关系。在面向对象的设计中, 好的依赖关系。在面向对象的设计中,依赖关系正好是相反 即与具体实现有关的类是依赖于抽象类或接口, 的,即与具体实现有关的类是依赖于抽象类或接口,其依赖 所示。 关系的结构一般如图 5 所示。
三、 依赖倒置原则
依赖倒置原则指的是依赖关系应该是尽量依赖接 或抽象类),而不是依赖于具体类。 ),而不是依赖于具体类 口(或抽象类),而不是依赖于具体类。为了说明依赖 倒置原则,先看结构化设计中的依赖关系。如图 4 所示。 倒置原则,先看结构化设计中的依赖关系。 所示。
图4 结构化设计中的依赖关系
一、开闭原则
开闭原则指的是一个模块在扩展性方面应该是开放的, 开闭原则指的是一个模块在扩展性方面应该是开放的, 而在更改性方面应该是封闭的。这个原则说的是, 而在更改性方面应该是封闭的。这个原则说的是,在写模 块的时候,应该尽量使得模块可以扩展, 块的时候,应该尽量使得模块可以扩展,并且在扩展时不 需要对模块的源代码进行修改。 需要对模块的源代码进行修改。开闭原则最初是由 Bertrand Meyer提出来的[Mey88],在所有的 OO 设计 提出来的[ ],在所有的 提出来的 ], 原则中,这个原则可能是最重要的。 原则中,这个原则可能是最重要的。 为了达到开闭原则的要求, 为了达到开闭原则的要求,在设计时要有意识地使用接 口进行封装,采用抽象机制, 中的多态技术。 口进行封装,采用抽象机制,并利用 OO 中的多态技术。
图3 Liskov替换原则的图示说明
的子类。 类 ClassA 要使用 ClassB,ClassC 是 ClassB 的子类。 , 如果在运行时, 代替ClassB,则 ClassA 仍然 如果在运行时,用 ClassC 代替 , 中提供的方法, 可以使用原来 ClassB 中提供的方法,而不需要做任何改 动。 替换原则, 利用 Liskov替换原则,在设计时可以把 ClassB 设计 替换原则 为抽象类(或接口)。 )。让 继承抽象类( 为抽象类(或接口)。让 ClassC 继承抽象类(或实现接 ),而 交互, 口),而 ClassA 只与 ClassB 交互,运行时 ClassC 会替 换 ClassB。这样可以保证系统有较好的可扩展性,同时 。这样可以保证系统有较好的可扩展性, 做修改。 又不需要对 ClassA 做修改。
ቤተ መጻሕፍቲ ባይዱ、接口分离原则
接口分离原则指的是在设计时采用多个与特定客户类 ( Client)有关的接口比采用一个通用的接口要好。也就是说, )有关的接口比采用一个通用的接口要好。也就是说, 一个类要给多个客户类使用, 一个类要给多个客户类使用,那么可以为每个客户类创建一 个接口,然后这个类实现所有这些接口, 个接口,然后这个类实现所有这些接口,而不要只创建一个 接口,其中包含了所有客户类需要的方法,然后这个类实现 接口,其中包含了所有客户类需要的方法, 这个接口。 这个接口。 所示是没有采用接口分离原则的设计。 如图 6 所示是没有采用接口分离原则的设计。
设计的开闭原则。 图 1 的设计不符合 OO 设计的开闭原则。如图 2 所示是改进的设计。 所示是改进的设计。图 2 中引入了接口 Printer,其中 , 有一个方法 print( )。现在 Output类只与接口 ( )。现在 类只与接口 Printer关联,在 Output中有类型为 Printer的变量 p。 关联, 关联 中有类型为 的变量 。 不管系统与哪种类型的打印机相连, 不管系统与哪种类型的打印机相连,输出时都调用 p.print()方法。而 p 的具体类型在运行时由系统确 ()方法 ()方法。 类型的对象, 定,可能是 Hp 类型的对象,也 可 能 是 Epson 类 型 的 对 象 或Canon 类型的对象。 类型的对象。
现在 Output类中不再有 if...else( 或 类中不再有 ( Switch...case)之类的分支结构,而且,如果系统要 )之类的分支结构,而且, 增加新的打印机类型,如 Legend 打印机,则只需增 增加新的打印机类型, 打印机, 加Legend 类,并且让 Legend 类实现 Printer接口即 接口即 内部不需要做任何改动。 可,而类 Output内部不需要做任何改动。因此,图 内部不需要做任何改动 因此, 2的设计具有较好的可扩展性。 的设计具有较好的可扩展性。 的设计具有较好的可扩展性
泛化结构的深度要适当。 泛化结构的深度要适当。类之间的泛化关系增加了类之间 的耦合性。除非是在特殊情况下( 如图形用户界面的类库), 的耦合性。除非是在特殊情况下( 如图形用户界面的类库), 一般不要设计有很深层次的类的泛化关系。 一般不要设计有很深层次的类的泛化关系。 定义简单的方法。一个类中的方法不应太复杂。如果一个 定义简单的方法。一个类中的方法不应太复杂。 方法太大,很可能就是这个方法包含的功能太多, 方法太大,很可能就是这个方法包含的功能太多,而有些功 能可能是不相关的。 能可能是不相关的。
图6 使用通用接口的设计
图7 使用分离接口的设计
现在对于每个客户类有一个专用的接口, 现在对于每个客户类有一个专用的接口,这个接口中 只声明了与这个客户类有关的方法, 只声明了与这个客户类有关的方法,而 ServiceImp 类实现了所有这些接口。 类实现了所有这些接口。如果 ClientA 要改变所使用 的接口中的方法, 的接口中的方法,则只需改动 ServiceA 接口和 ServiceImp 类即可,对 ClientB 和 ClientC 不会有影 类即可, 响。 当然使用这条原则并不是一定要给每个客户类创建一 个接口,在某些情况下, 个接口,在某些情况下,如果多个客户类确实需要使 用同一个接口也是可以的。 用同一个接口也是可以的。
采用这种设计方法的问题是, 采用这种设计方法的问题是,如果 ClientA 类需要改 接口中的方法, 变所使用的 Service接口中的方法,则不但要改动 Service接 接口中的方法 接 口和 ServiceImp 类,还要对 ClientB 类和 ClientC 类重新编 也就是说, 译。也就是说,对 ClientA 的修改会影响 ClientB 和 ClientC,因此图 6 的设计是一种不好的设计。 的设计是一种不好的设计。 , 所示是采用了接口分离原则的设计。 如图 7所示是采用了接口分离原则的设计。 所示是采用了接口分离原则的设计
图5 面向对象设计中的依赖关系