动机
在本文中职责是指引起变化的原因。该原则表明,如果你有多个原因去改变一个类,那么应该把这些引起变化的原因分离开,把这个类分成多个类,每个类只负责处理一种改变。当你做出某种改变时,只需要修改负责处理该改变的类。当我们去改变一个具有多个职责的类时可能会影响该类的其他功能。
单一职责原则
一个类应该只受一种变化的影响。
单一职责原则简单而直观,但是在实际实现中可能是很困难的。
实例
假设我们需要一个对象保存email信息,在下面的例子中我们将使用IEMAIL接口。初看起来,一切都很好。但是仔细分析我们会发现我们的IEMAIL接口和Email类具有两个职责(两种引起改变的原因)。一个是在一些类似pop3和imap的email协议下使用该类,如果需要支持其他的协议,需要以其他的方式格式化内容字段,并且需要添加新的代码来支持新的协议。另一个是Content字段,尽管content字段是字符串类型,或许我们将来要支持其他的格式,例如HTML格式。
如果我们只用一个类,一个职责的改变可能会影响另一个:
- 添加新的协议需要添加新的代码解析和格式化内容字段。
- 添加新的内容类型(例如HTML)需要为每种已实现的协议添加代码。
-
-
interface IEmail {
-
public void setSender(String sender);
-
public void setReceiver(String receiver);
-
public void setContent(String content);
- }
-
-
class Email implements IEmail {
-
public void setSender(String sender) {
-
- }
-
-
public void setReceiver(String receiver) {
-
- }
-
-
public void setContent(String content) {
-
- }
- }
//single responsibility principle - bad example
interface IEmail {
public void setSender(String sender);
public void setReceiver(String receiver);
public void setContent(String content);
}
class Email implements IEmail {
public void setSender(String sender) {
// set sender;
}
public void setReceiver(String receiver) {
// set receiver;
}
public void setContent(String content) {
// set content;
}
}
我们可以创建一个新的IContent接口和一个新的Content类来分离职责。让每一个类只承担一个职责可以给我们的设计带来更多的灵活性:
- 添加新的协议时只需要修改Email类。
- 添加新的内容类型时只需要修改Content类。
-
-
-
interface IEmail {
-
public void setSender(String sender);
-
public void setReceiver(String receiver);
-
public void setContent(IContent content);
- }
-
-
interface IContent {
-
public String getAsString();
- }
-
-
class Email implements IEmail {
-
public void setSender(String sender) {
-
- }
-
-
public void setReceiver(String receiver) {
-
- }
-
-
public void setContent(IContent content) {
-
- }
- }
//single responsibility principle - good example
interface IEmail {
public void setSender(String sender);
public void setReceiver(String receiver);
public void setContent(IContent content);
}
interface IContent {
public String getAsString(); // used for serialization
}
class Email implements IEmail {
public void setSender(String sender) {
// set sender;
}
public void setReceiver(String receiver) {
// set receiver;
}
public void setContent(IContent content) {
// set content;
}
}
总结
单一职责原则代表了设计应用程序时一种很好的识别类的方式,并且它提醒你思考一个类的所有演化方式。只有对应用程序的工作方式有了很好的理解,才能很好的分离职责。
分享到:
相关推荐
1. **SRP单一职责原则**:单一职责原则强调一个类应当只有一个引起它变化的原因。这意味着每个类的设计应聚焦于完成一项任务,当需求变化时,只应影响到该类本身,而不牵涉到其他类。这样做的好处在于提高了代码的...
1. **单一职责原则(SRP)**:一个类应该只有一个引起它变化的原因。这意味着每个类应专注于一项任务,避免将多个职责混杂在一起。在员工工资计算的例子中,`Employee`类只负责提供薪金计算的接口,具体的计算逻辑则...
面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则
面向对象设计原则概述 单一职责 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则
首先,我们来了解四个基础的面向对象设计原则:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)和接口隔离原则(ISP)。 1. 单一职责原则(Single Responsibility Principle, SRP):一个类或模块...
面向对象设计原则总结 面向对象设计原则是软件设计中最重要的原则之一,它们是软件设计的基础和核心。面向对象设计原则的应用可以提高软件的开发效率、质量和可维护性。下面是七大面向对象设计原则的总结: 一、开...
3. **单一职责原则(Single Responsibility Principle, SRP)** - **原则阐述**:一个类应该只有一个改变的原因。 - **实践意义**:通过将类的功能细化到单一职责,降低类的复杂度,提高代码的可读性和可维护性。 ...
1. **单一职责原则(Single Responsibility Principle, SRP)** 这一原则规定,一个类应该只有一个引起其变化的原因。换句话说,每个类应专注于完成一个特定的职责或功能,避免职责混杂。这样可以提高代码的稳定性...
### 面向对象设计原则详解 面向对象设计原则是一系列指导软件开发人员构建高质量、易于维护和扩展的软件系统的准则。这些原则旨在帮助开发者创建更健壮、更灵活的系统,减少代码间的耦合度,并提高代码的重用性和...
1. **单一职责原则(SRP)**:每个类或模块应仅有一个引起其变化的原因,以保持代码的高内聚性。 2. **开放封闭原则(OCP)**:软件实体(类、模块、函数等)应该是可扩展的,但对修改应封闭。这意味着新增功能时,...
面向对象编程的七大原则是指在面向对象设计中所遵循的七个基本原则,它们是:开闭原则、依赖倒转原则、单一职责原则、接口隔离原则、迪米特法则、里氏替换原则和组合优于继承原则。 1. 开闭原则(Open-Closed ...
以下将详细介绍面向对象设计的六大原则:单一职责原则(Single Responsibility Principle, SRP)、开放封闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)、依赖倒置原则...
面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则
1. 单一职责原则(SRP):一个类或模块应只有一个改变的原因。这有助于保持代码的模块化,降低耦合度。 2. 开放封闭原则(OCP):软件实体(类、模块、函数等)应对扩展开放,对修改关闭。这意味着我们可以添加新的...
面向对象设计原则是OOPS(Object-Oriented ...这些原则已知的有七个,包括:单一职责原则、开闭原则、里氏代换原则、依赖注入(倒转)原则、接口分离原则、迪米特原则、合成聚合复用原则。(文件包括实例源码及文档)
1. **设计原则**:面向对象设计模式的基础,如单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP)。这些原则指导我们编写可维护、可扩展的代码。 2. **常见设计模式*...