动机
当我们设计应用程序的时候,如果一个模块包含多个子模块,那么我们应该小心对该模块做出抽象。设想该模块由一个类实现,我们可以把系统抽象成一个接口。但是当我们想要添加一个新的模块扩展程序时,如果要添加的模块只包含原系统中的一些子模块,那么就会强迫我们实现接口中的所有方法,并且还要编写一些哑方法。这样的接口被称为胖接口或者叫被污染的接口,使用这样的接口将会给系统引入一些不正确的行为。
接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块。
接口隔离原则
不应该强迫客户端依赖于他们不会使用的接口。
实例
下面是一个违反了接口隔离原则的例子。我们使用Manager类代表一个管理工人的管理者。有两种类型的工人:普通的和高效的,这两种工人都需要吃午饭。现在来了一批机器人,它们同样为公司工作,但是他们不需要吃午饭。一方面Robot类需要实现IWoker接口,因为他们要工作,另一方面,它们又不需要实现IWorker接口,因为它们不需要吃饭。
在这种情况下IWorker就被认为是一个被污染了的接口。
如果我们保持现在的设计,那么Robot类将被迫实现eat()方法,我们可以写一个哑类它什么也不做(比如说它只用一秒钟的时间吃午饭),但是这会对程序造成不可预料的结果(例如管理者看到的报表中显示被带走的午餐多于实际的人数)。
根据接口隔离原则,一个灵活的设计不应该包含被污染的接口。对于我们的例子来说,我们应该把IWorker分离成2个接口。
-
-
-
interface IWorker {
-
public void work();
-
-
public void eat();
- }
-
-
class Worker implements IWorker {
-
public void work() {
-
- }
-
-
public void eat() {
-
- }
- }
-
-
class SuperWorker implements IWorker{
-
public void work() {
-
- }
-
-
public void eat() {
-
- }
- }
-
-
class Manager {
- IWorker worker;
-
-
public void setWorker(IWorker w) {
- worker=w;
- }
-
-
public void manage() {
- worker.work();
- }
- }
// interface segregation principle - bad example
interface IWorker {
public void work();
public void eat();
}
class Worker implements IWorker {
public void work() {
// ....working
}
public void eat() {
// ...... eating in launch break
}
}
class SuperWorker implements IWorker{
public void work() {
//.... working much more
}
public void eat() {
//.... eating in launch break
}
}
class Manager {
IWorker worker;
public void setWorker(IWorker w) {
worker=w;
}
public void manage() {
worker.work();
}
}
下面是遵循接口隔离原则的代码。通过把IWorker分离成两个接口,Robot类不需要再被强迫实现eat()方法。如果我们需要为Robot类添加其他的功能,例如重新充电,我们可以创建一个新的IRechargeable接口,其中包含一个重新充电的方法recharge。
-
-
-
interface IWorkable {
-
public void work();
- }
-
-
interface IFeedable{
-
public void eat();
- }
-
-
class Worker implements IWorkable, IFeedable {
-
public void work() {
-
- }
-
-
public void eat() {
-
- }
- }
-
-
class SuperWorker implements IWorkable, IFeedable{
-
public void work() {
-
- }
-
-
public void eat() {
-
- }
- }
-
-
class Robot implements IWorkable{
-
public void work() {
-
- }
- }
-
-
class Manager {
- IWorkable worker;
-
-
public void setWorker(IWorkable w) {
- worker = w;
- }
-
-
public void manage() {
- worker.work();
- }
- }
//interface segregation principle - good example
interface IWorkable {
public void work();
}
interface IFeedable{
public void eat();
}
class Worker implements IWorkable, IFeedable {
public void work() {
// ....working
}
public void eat() {
//.... eating in launch break
}
}
class SuperWorker implements IWorkable, IFeedable{
public void work() {
//.... working much more
}
public void eat() {
//.... eating in launch break
}
}
class Robot implements IWorkable{
public void work() {
// ....working
}
}
class Manager {
IWorkable worker;
public void setWorker(IWorkable w) {
worker = w;
}
public void manage() {
worker.work();
}
}
总结
如果已经设计成了胖接口,可以使用适配器模式隔离它。
像其他设计原则一样,接口隔离原则需要额外的时间和努力,并且会增加代码的复杂性,但是可以产生更灵活的设计。如果我们过度的使用它将会产生大量的包含单一方法的接口,所以需要根据经验并且识别出那些将来需要扩展的代码来使用它。
分享到:
相关推荐
5. **ISP接口隔离原则**:接口隔离原则建议,不应强迫客户依赖于他们不使用的方法。这通常意味着,应当为不同的用户群体提供多个特定接口,而不是一个庞大的通用接口,从而减少不必要的依赖和耦合。 6. **REP重用...
4. **接口隔离原则(ISP)**:客户端不应该被迫依赖它不使用的方法。如果一个接口包含客户端不需要的方法,应该拆分为多个更小的接口。这有助于减少类之间的耦合。 5. **依赖倒置原则(DIP)**:高层次模块不应该...
面向对象设计原则总结 面向对象设计原则是软件设计中最重要的原则之一,它们是软件设计的基础和核心。面向对象设计原则的应用可以提高软件的开发效率、质量和可维护性。下面是七大面向对象设计原则的总结: 一、开...
对面向对象设计原则的总结,设计模式:“开-闭”原则,里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则
5. **接口隔离原则(Interface Segregation Principle, ISP)** - **原则阐述**:客户端不应该被迫依赖于它不使用的方法。 - **实践意义**:通过精简接口设计,减少类之间的耦合,使系统更加易于理解和扩展。 6. ...
首先,我们来了解四个基础的面向对象设计原则:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)和接口隔离原则(ISP)。 1. 单一职责原则(Single Responsibility Principle, SRP):一个类或模块...
面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则
4. **接口隔离原则(Interface Segregation Principle, ISP)** 这个原则建议将大的、臃肿的接口分解为更小、更具体的接口,确保客户端只使用他们真正需要的方法。这样做可以减少类之间的耦合度,提高灵活性。 5. ...
面向对象设计原则与设计模式是软件工程领域的重要组成部分,它们为构建高质量、可维护和可扩展的软件系统提供了指导方针。下面将详细阐述面向对象设计原则及其如何促进软件的复用,以及设计模式的概念。 ### 面向...
面向对象设计原则概述 单一职责 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则
4. **接口隔离原则(ISP)**:客户端不应该强迫依赖它不使用的接口方法。接口应该被分解为更小、更具体的接口。 5. **依赖倒置原则(DIP)**:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖...
接口隔离原则(Interface Segregation Principle,ISP)是设计模式中的一个重要原则,它是 SOLID 原则之一。SOLID 是面向对象设计的五个基本原则的首字母缩写,由 Robert C. Martin 提出,旨在使软件设计更加灵活、...
面向对象编程的七大原则是指在面向对象设计中所遵循的七个基本原则,它们是:开闭原则、依赖倒转原则、单一职责原则、接口隔离原则、迪米特法则、里氏替换原则和组合优于继承原则。 1. 开闭原则(Open-Closed ...
4. 接口隔离原则(ISP):客户端不应该被迫依赖它不使用的方法。接口应该尽可能小且具体,避免过大的接口导致不必要的耦合。 5. 依赖倒置原则(DIP):依赖于抽象,而不是依赖于具体实现。这样可以更容易地替换实现...
DIP)、接口隔离原则(Interface Segregation Principle, ISP)以及合成/聚合复用原则(Composite/Aggregate Reuse Principle, CARP)。 #### 1. 单一职责原则(Single Responsibility Principle, SRP) - **定义...
面向对象设计原则,开闭原则,迪米特法则,里氏代换,接口隔离
4. 接口隔离原则(Interface Segregation Principle, ISP): 避免客户端依赖它不需要的方法,提倡创建多个小而专的接口,而不是一个大而全的接口。 5. 依赖倒置原则(Dependency Inversion Principle, DIP): ...