接口隔离原则

# 接口隔离原则(Interface Segregation Principle) 定义:要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。 注意⚠️: - 一个类对一个类的依赖应该建立在最小的接口上; - 建立单一的接口,避免建立庞大的,臃肿的耦合关系; - 尽量细化接口,接口总的方法在合适的情况下,尽可能的少,但要适度,适度! ## 反例 ![](https://oscimg.oschina.net/oscnet/up-9e10f91e67ddbf601a1ad23bb9462a541f2.png) ## IAnimal 定义的接口 ```text public interface IAnimal { void eat(); void fly(); void swim(); } ``` ## Bird实现IAnimal接口 ```text public class Bird implements IAnimal{ @Override public void eat() { } @Override public void fly() { } @Override public void swim() { } } ``` ## Dog实现IAnimal接口 ```text public class Dog implements IAnimal{ @Override public void eat() { } @Override public void fly() { } @Override public void swim() { } } ``` ## 接口隔离 下面进行IAnimal接口拆分👇: ![](https://oscimg.oschina.net/oscnet/up-fb4f92ae1bb941d8be7c3cf24239b0d801e.png) ## IEat接口 ```text public interface IEat { void eat(); } ``` ## IFly接口 ```text public interface IFly { void fly(); } ``` ## ISwim接口 ```text public interface ISwim { void swim(); } ``` ## Bird 实现IEat、IFly ```text public class Bird implements IEat, IFly { @Override public void eat() { } @Override public void fly() { } } ``` ## Dog实现IEat、ISwim ```text public class Dog implements IEat,ISwim{ @Override public void eat() { } @Override public void swim() { } } ``` ## 接口隔离原则的优点 **接口隔离原则是为了约束接口、降低类对接口的依赖性,遵循接口隔离原则有以下 5 个优点👇:** - 将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。 - 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。 - 如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险。 - 使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。 - 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。 ## 接口隔离原则的实现方法 **在具体应用接口隔离原则时,应该根据以下几个规则来衡量。👇** - 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。 - 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。 - 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。 - 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。 ## 接口隔离原则和单一职责原则 **相同点👇:** 都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想; **不同点👇:** - 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。 - 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。