跟我学面向对象设计中的五大原则——“单一职责”原则
面向对象设计的准则

面向对象设计的准则面向对象设计的准则面向对象设计是一种软件设计方法,它将现实世界中的事物抽象为对象,并通过封装、继承和多态等特性来描述它们之间的关系。
在进行面向对象设计时,需要遵循一些准则,以确保系统具有良好的可维护性、可扩展性和可重用性。
一、单一职责原则单一职责原则(Single Responsibility Principle, SRP)指一个类只负责一个职责,即一个类应该只有一个引起它变化的原因。
如果一个类承担了过多的职责,那么在其中任何一个职责发生变化时都可能会影响到其他职责,从而导致系统变得复杂难以维护。
二、开放封闭原则开放封闭原则(Open-Closed Principle, OCP)指软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
也就是说,在不修改已有代码的情况下,可以通过添加新代码来扩展系统功能。
这样可以保证系统的稳定性和灵活性。
三、里氏替换原则里氏替换原则(Liskov Substitution Principle, LSP)指如果子类能够替换其父类并且程序执行不会出错,则这个子类符合里氏替换原则。
也就是说,子类应该能够完全替代父类,并且在使用父类的地方都可以使用子类。
四、依赖倒置原则依赖倒置原则(Dependency Inversion Principle, DIP)指高层模块不应该依赖于低层模块,而是应该依赖于抽象接口。
也就是说,要针对抽象编程,而不是针对具体实现编程。
这样可以降低模块之间的耦合度,提高系统的灵活性和可维护性。
五、接口隔离原则接口隔离原则(Interface Segregation Principle, ISP)指一个类不应该强迫它的客户端依赖于它们不需要的方法。
也就是说,要将接口拆分为更小更具体的接口,以避免客户端依赖于它们不需要的方法。
六、迪米特法则迪米特法则(Law of Demeter, LoD)指一个对象应该对其他对象有尽可能少的了解。
也就是说,在设计系统时要尽量减少对象之间的耦合度,避免出现过多的直接关系。
面向对象五大原则

面向对象五大原则
面向对象的五大原则是:
1、单一职责原则(Single Responsibility Principle):一个类应
该只负责一项职责,不要乱加功能;
2、开放封闭原则(Open Closed Principle):软件实体(类、模块、函数等)应该可以扩展,但不可修改;
3、里氏替换原则(Liskov Substitution Principle):子类必须能
够替换掉基类,而且程序的行为不应该受到影响;
4、依赖倒置原则(Dependency Inversion Principle):高层模块
不应该依赖于低层模块,而是应该依赖于抽象;
5、接口隔离原则(Interface Segregation Principle):客户端不
应该依赖于它不需要的接口;接口本身应该尽可能小,将大的接口分解成
多个接口,这样每个接口的职责就更加明确。
面向对象设计原则与实践

面向对象设计原则与实践面向对象设计(Object-Oriented Design, OOD)是一种软件设计方法论,它以“对象”为中心,将现实中的事物抽象成软件中的对象,使用面向对象的思想实现软件开发过程。
面向对象设计的原则和实践是一个非常广泛的话题,涉及到多种设计原则和方法,本文将从五个方面进行探讨。
一、单一职责原则(Single Responsibility Principle, SRP)单一职责原则是指一个类只负责一个功能,即一个类只有一个职责(或引起类变化的原因)。
如果一个类负责太多功能,那么当其中一个功能改变时,可能会影响其他功能,导致不必要的代码改动。
因此,我们需要将一个类拆分成更小的类,每个类只负责一个功能,将功能之间的耦合度降到最低。
例如,我们在设计一个计算器程序时,可以将计算器拆分成显示器、按钮、运算器等多个类,每个类只负责自己的功能,这样当其中一个功能改变时,不会对其他功能造成影响。
二、开闭原则(Open-Closed Principle, OCP)开闭原则是指一个软件实体应该对扩展开放,对修改关闭。
在软件开发过程中,需求随时可能发生变化,如果一个类的实现是不可变的,那么需要对其进行修改时就需要修改原有的代码,这将会带来一定的风险。
因此,我们需要将一个类的实现设计成可扩展的,当需求改变时,可以通过扩展这个类来满足新需求,而不是修改原有的代码。
例如,在一个图形绘制程序中,我们可以定义一个基类Shape,然后派生出Rectangle、Circle、Triangle等子类,当需要增加新的图形时,只需要扩展这些子类即可。
三、里氏替换原则(Liskov Substitution Principle, LSP)里氏替换原则是指子类可以替换其父类并能够正常工作。
换句话说,一个子类应该能够替代其父类并继承其全部属性和方法,而不需要修改原有的代码。
如果一个子类不能完全替代其父类,那么就需要重新设计类的继承关系,将其拆分为更小的类,或者调整类的功能划分。
面向对象设计应遵循那些准则

面向对象设计应遵循那些准则
1. 单一职责原则(SRP):一个类或对象只应该有一个单一的职责或目的。
2. 开闭原则(OCP):开放扩展、封闭修改,即设计应该尽可能地支持拓展,而不是修改现有代码。
3. 里式替换原则(LSP):任何父类出现的地方,都可以用其子类替换,而不会影响程序的正确性。
4. 接口隔离原则(ISP):不应该强制一个类实现它用不到的接口,而是应该将接口细分为更小、更具体的接口。
5. 依赖倒置原则(DIP):高层模块不应该依赖低层模块,两者都应该依赖于抽象接口,即程序设计的抽象应该依赖于细节,而不是细节依赖于抽象。
6. 迪米特法则(LoD):一个对象应该仅知道与其相关的对象,而不应该知道与其无关的对象。
7. 组合/聚合复用原则(CARP):优先使用组合或聚合的方式实现代码复用,而不是继承。
面向对象中常见的设计原则

面向对象中常见的设计原则在面向对象编程中,设计原则是指用于指导软件设计的一系列准则和规范。
这些原则帮助软件开发者创建出高质量、可维护、可扩展的代码。
本文将介绍面向对象中常见的设计原则,包括单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则和迪米特法则。
1. 单一职责原则(Single Responsibility Principle, SRP)单一职责原则指的是一个类或模块应该有且只有一个引起它变化的原因。
换句话说,一个类或模块应该只负责一项任务。
这样可以提高代码的可读性、可维护性和可测试性。
当一个类承担了过多的职责时,如果其中一个职责发生变化,可能会影响到其他职责,导致代码的瓦解。
2. 开闭原则(Open-Closed Principle, OCP)开闭原则指的是软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
也就是说,当需求发生变化时,应该通过扩展已有的代码来实现新的功能,而不是修改已有的代码。
这样可以避免引入新的错误,并保持已有代码的稳定性。
3. 里氏替换原则(Liskov Substitution Principle, LSP)里氏替换原则是指子类应该能够替换掉父类并且不会影响程序的正确性。
换句话说,子类应该能够完全替代父类的行为,而不需要修改其他代码。
这样可以提高代码的可复用性和可扩展性。
4. 依赖倒置原则(Dependency Inversion Principle, DIP)依赖倒置原则是指高层模块不应该依赖低层模块,二者都应该依赖于抽象。
抽象不应该依赖于具体实现细节,具体实现细节应该依赖于抽象。
这样可以降低模块之间的耦合度,提高代码的灵活性和可维护性。
5. 接口隔离原则(Interface Segregation Principle, ISP)接口隔离原则是指客户端不应该依赖它不需要的接口。
一个类对另一个类的依赖应该建立在最小的接口上。
这样可以避免出现臃肿的接口和冗余的代码,提高系统的可扩展性和可维护性。
面向对象设计原则

面向对象设计原则面向对象设计原则是一系列在面向对象编程中应用的设计原则,它们可以帮助我们构建可维护、可扩展和可重用的软件系统。
下面是其中一些重要的面向对象设计原则:1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起变化的原因。
换句话说,每个类应该只负责处理单一的责任,这样可以提高类的内聚性,降低类的耦合度,增强系统的模块化和扩展性。
2. 开放封闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。
这意味着在不修改已有代码的情况下,可以通过扩展现有代码来实现新功能。
这样可以提高系统的可维护性和可复用性。
3. 里氏替换原则(Liskov Substitution Principle,LSP):子类型必须能够替换掉它们的父类型,而对应的系统行为不应该发生改变。
简而言之,任何基类可以被它的子类替代,而且原本运行的代码可以正常工作。
4. 依赖倒置原则(Dependence Inversion Principle,DIP):高层模块不应该依赖低层模块,它们共同依赖于抽象。
简而言之,模块之间的依赖关系应该通过接口或抽象类来实现,而不是具体的实现类。
5. 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该强迫依赖它不需要的接口。
接口应该足够小,只包含客户端所需的方法,避免接口臃肿和功能耦合。
6. 迪米特法则(Law of Demeter,LoD):一个对象应当尽可能少地与其他对象之间进行相互作用。
简而言之,一个对象应该只与其直接朋友进行通信,不要和陌生对象发生直接的交互。
这些面向对象设计原则可以帮助我们构建具有高内聚、低耦合的软件系统。
它们提供了一系列指导原则,有助于我们在设计和实现过程中做出更好的选择,并提供了一些模式和原则,可以帮助我们解决常见的设计问题。
面向对象程序设计的基本原则与实践

面向对象程序设计的基本原则与实践现今软件开发的主流编程范式之一就是面向对象(Object-oriented)编程。
在面向对象编程中,程序员将问题领域中的对象映射到程序设计中,构建出一套对象模型,并通过对对象属性、方法和相互关系的设计和组织,最终完成复杂系统的开发。
而面向对象程序设计的基本原则与实践就是指在此过程中,程序员必须要遵守的一些规则和方法论。
下面,我将从五个方面探讨面向对象程序设计的基本原则与实践。
一、单一职责原则单一职责原则(Single Responsibility Principle,简称SRP)是指一个类只负责一项职责。
也就是说,一个类只应该有一个引起它变化的原因。
单一职责原则的实践,可以使得程序的扩展性和可维护性得到提升。
因为,一个类中的各个职责之间相互关联,如果一个职责需要被修改,那么所有与其相关的职责都必须被修改,从而增加了软件维护的难度。
而遵循单一职责原则,将不同的职责分离到不同的类中,可以使得程序中的各个模块之间耦合度降低,提高程序的可维护性和可复用性。
二、开闭原则开闭原则(Open Close Principle,简称OCP)是指一个软件实体,应该是可以扩展的,但是不可修改的。
也就是说,对于已有的代码,应该将其视为一个黑盒子,不应该改变其中的代码,而是应该通过扩展代码来实现新的功能。
开闭原则的实践,可以使得程序的可扩展性和可维护性得到提升。
因为,如果直接修改代码,将可能导致代码的其他部分出现问题,从而增加了软件开发和维护的难度。
而遵循开闭原则,可以将不同的功能模块进行解耦,从而使得程序的代码关系更加明晰,便于软件的开发和维护。
三、里氏替换原则里氏替换原则(Liskov Substitution Principle,简称LSP)是指一个软件实体,应该可以在不改变使用该实体的情况下,可以被该实体的子类替换。
也就是说,尽管子类在接口、实现等方面与父类不同,但是依然可以被父类的使用者调用。
面向对象设计的5个原则

Liskov替换原则(Liskov-Substituion Principle)。"子类型必须能够替换掉它们的基类型。"本原则和开放封闭原则关系密切,正是子类型的可替换性,才使得使用基类型模块无需修改就可扩充。Liskov替换原则从基于契约的设计演化而来,契约通过为每个方法声明"先验条件"和"后验条件";定义子类时,必须遵守这些"先验条件"和"后验条件"。当前基于契的设计发展势头正劲,对实现"软件工厂"的"组装生产"梦想是一个有力的支持。
良性依赖原则。"不会在实际中造成危害的依赖关系,都是良性依赖。"通过分析不难发现,本原则的核心思想是"务实",很好地揭示了极限编程(Extreme Programming)中"简单设计"各"重构"的理论基础。本原则可以帮助我们抵御"面向对象设计五大原则"以及设计模式的诱惑,以免陷入过度设计(Over-engineering)的尴尬境地,带来不必要的复杂性。
接口隔离原则(Interface-Segregation Principle)。"多个专用接口优于一个单一的通用接口。"本原则是单一职责原则用于接口设计的自然结果。一个接口应该保证,实现该接口的实例对象可以只呈现为单一的角色;这样,当某个客户程序的要求发生变化,而迫使接口发生改变时,影响到其他客户程序的可能生性小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不管它是不是用到了数据连接功能。 (4)改进的设计方案
我们应该把这两部分适当的分离开来,重新对上面的接口进行设计:
class SomeDBConnectionBean
杨教授大学堂,版权所有,盗版必究。
2/10 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
{ public void ConnectDB() { } public void DisConnectDB() { } //other DB Functions;
杨教授大学堂,版权所有,盗版必究。 3/10 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
们写到同一个类体中,否则代码将会很混乱。 同时,在业务处理层的设计中,我们将各个业务模块中的共同功能要求抽出放到业务
基类中,这样使的各个子类完成其特有的功能。从而分清基类的职责(完成共同的功能实 现)和各个子类的职责(完成各个具体的业务功能实现)。 (2)应用示例代码----没有遵守单一职责原则时的代码 import java.sql.*; import java.io.*; public class JavaJdbc {
this.dbConnection = dbConnection; } }
1.1.2 遵守单一职责原则的应用示例
1、单一职责原则应用示例之一 (1)问题的技术背景
在数据访问层组件的设计中,我们将其拆分为数据实体类、数据访问逻辑组件和数据 连接组件的目的,就是为了能够遵守组件类在设计时的“单一职责愿则”。从而避免将它
try { Class.forName(DBDriver); } catch(ClassNotFoundException e) { System.out.println(e); } try {
杨教授大学堂,版权所有,盗版必究。 1/10 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
可维护性和扩展性。
4、应用示例 (1)问题示例
比如我们要设计一个类,这个类需要从数据库中取出一个人的姓名等基本信息,并根
据用户的要求修改后再保存到数据库中。下面为其接口定义
class SomeDAOBean
String url="jdbc:odbc:studlist"; String DBDriver="sun.jdbc.odbc.JdbcOdbcDriver";
Connection con=null; Statement stmt=null; ResultSet rs=null; ResultSetMetaData metaData; public JavaJdbc() {
现实中就是如此,如果我们专心做一件事情,任何人都有信心可以做得很出色。但如 果,我们整天被乱七八糟的事所累,还有心思和精力把每件事都作好么? 1、什么是 SRP:就一个类而言,应该仅有一个引起它的变化的原因
1) 避免相同的职责分(也称为功能)散到不同的类之中 2) 避免一个类承担过多的职责。 总之,单一原则就是要求对类的改变只能有一个(多个职责一定就要被分开吗?也不 一定,当应用程序的变化方式总是导致这几个职责同时变化,那么就不必分离他们)。当不 满足这一原则时,我们需要对类进行重构----撤分这个类了,一般会使用提取接口,提取 类,提取方法。 2、应用的目的:减少类之间的耦合,当需求变化时,只修改一个地方 我们知道,最简单、最单纯的事情是最容易控制的,并且也是最有效的;类的职责简 单而且集中,避免相同的职责分散到不同的类之中-----也就是要避免一个类承担过多的职 责。 这样,将能够减少类之间的耦合,当需求发生变化时,我们只需要修改一个地方。 3、为什么要遵守单一职责原则 (1)有助于我们分析和编码的思路的清晰 当我们的代码里有了三层或以上的 if 语句或 for 语句的嵌套的时候,说明我们还没有 把问题分析清楚。 (2)使我们的编码、测试和维护变得简单。 (3)将一个个复杂的问题简单化以后,易于代码的重用 当我们的代码的多个功能搅和在一起的时候,我们是没办法考虑代码的重用的,因为 我们的每一处代码都有不同。 (4)易于系统的扩展。 单一职责原则是一个既简单又实用的原则。我们遵守了这一原则,可能会多写一些类 和代码,但磨刀不误砍柴工。该原则既有利于我们编码思路的清晰,又大大增强了代码的
}
class SomeDAOBean {
public ResultSet GetPersonInfo() { } public boolean SavePersonInfo() { } private SomeDBConnectionBean dbConnection; public PersonWageInfo(SomeDBConnectionBean dbConnection) {
{
public void ConnectDB()
{
}
public void DisConnectDB()
{
}
public ResultSet GetPersonInfo()
{
}
public boolean SavePersonInfo()
{
}
..
} (2)该种设计将大致有两种职责
实际上我们看到了,在上面的这个接口中,实际上引起它变化的原因有两种了:一个
是数据库的变化(由 ConnectDB 和 DisConnectDB 方法来体现),另一个是保存用户信息的
规则发生变化(由 SavePersonInfo 方法来体现)。 (3)所带来的后果
这样做会有潜在的问题:当仅需要改变数据连接方式时,必须修改 SomeDAOBean 类,
而修改 SomeDAOBean 类的结果就是使得任何依赖 SomeDAOBean 类的元素都需要重新编译,
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
1.1 跟我学面向对象设计中的五大原则——“单一职责”原则
1.1.1 单一职责原则 SRP(Single-Responsibility Principle)
单一职责很容易理解,也很容易实现。所谓单一职责,就是一个设计元素只做一件事。 什么是“只做一件事”?简单说就是少管闲事。