🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 接口隔离原则 英文名称:Interface segregation Principle 先了解接口的分类: 1、**实例接口**(Object Interface):java中声明一个类,使用new关键字产生一个实例,它是一个类型的事物的描述这是一种接口。 例如 Person p = new Person();创建了一个对象p,Person类就是p的接口。 2、**类接口**(Class Interface)java中使用interface定义的接口。 定义一:客户端不应该依赖它不需要的接口。 定义二:类间的依赖关系应该建立在最小的接口上。 我的理解:定义接口时,要尽量将接口细化,按照类别的不同建立不同的接口类型。一个接口中要避免没有共享方法的类。 **一个例子**: 星探发现美女。 1、定义一个AbstractSearcher抽象类,定义AbstractSearcher()方法和show方法, 2、星探类Searcher类,继承抽象类。 3、IPettyGirl接口,定义美女的规范。void goodLook(),niceFigure(),greatTemperament(). 4,美女类实现IPettyGirl接口。 ![](https://box.kancloud.cn/2016-06-06_5755340708f89.jpg) ~~~ <span style="font-size:18px;">public class ISPTest { public static void main(String[] args) { Researcher r = new Researcher("lzl"); r.show(); r.AbstractSearch(new Girl("xy")); } } abstract class AbstractSearcher{ public abstract void AbstractSearch(IPettyGirl pettyGirl); public abstract void show(); } class Researcher extends AbstractSearcher{ private String name; public Researcher(String name) { this.name = name; } @Override public void AbstractSearch(IPettyGirl pettyGirl) { pettyGirl.goodLook(); pettyGirl.greatTemperament(); pettyGirl.niceFigure(); } @Override public void show() { System.out.println(this.name+":星探展示发现美女...."); } } interface IPettyGirl{ public void goodLook(); public void niceFigure(); public void greatTemperament(); } class Girl implements IPettyGirl{ private String name; public Girl(String name) { this.name = name; } @Override public void goodLook() { // TODO Auto-generated method stub System.out.println(this.name+"很好看..."); } @Override public void niceFigure() { // TODO Auto-generated method stub System.out.println(this.name+"身材很棒!"); } @Override public void greatTemperament() { // TODO Auto-generated method stub System.out.println(this.name+"很有气质!"); } }</span> ~~~ -**--需求变更:** 以上对美女的要求是同时满足这三个条件,那么现在要求满足分类:满足气质好的属于内在型美女,满足身材好和长相好的属于外在型美女。 此时我们发现定义的IPettyGirl接口中封装了气质好的内在型美女,这样此接口就显得臃肿了,灵活性不高,可维护性也不好。 解决方案: 将IPettyGirl接口划分为两个接口ITemperamentPettyGirl和IGoodBodyGirl. 星探类可以分别发现这两款美女。 ![](https://box.kancloud.cn/2016-06-06_5755340721c0f.jpg) ~~~ public class ISPTest2 { public static void main(String[] args) { Researcher2 r1 = new Researcher2("lzl"); r1.show(); r1.AbstractSearch((ITemperamentPettyGirl)new Girl2("xy")); } } abstract class AbstractSearcher2{ public abstract void AbstractSearch(ITemperamentPettyGirl temperamentGirl); public abstract void AbstractSearch(IGoodBodyGirl goodBodyGirl); public abstract void show(); } class Researcher2 extends AbstractSearcher2{ private String name; public Researcher2(String name) { this.name = name; } @Override public void AbstractSearch(ITemperamentPettyGirl temperamentGirl) { temperamentGirl.greatTemperament(); } @Override public void AbstractSearch(IGoodBodyGirl goodBodyGirl) { // TODO Auto-generated method stub goodBodyGirl.goodLook(); goodBodyGirl.niceFigure(); } @Override public void show() { // TODO Auto-generated method stub System.out.println(this.name+"星探发现美女..."); } } //气质型美女 interface ITemperamentPettyGirl{ public void greatTemperament(); } //身材好美女 interface IGoodBodyGirl{ public void goodLook(); public void niceFigure(); } class Girl2 implements ITemperamentPettyGirl,IGoodBodyGirl{ private String name; public Girl2(String name) { this.name = name; } @Override public void goodLook() { // TODO Auto-generated method stub System.out.println(this.name+"很好看..."); } @Override public void niceFigure() { // TODO Auto-generated method stub System.out.println(this.name+"身材很棒!"); } @Override public void greatTemperament() { // TODO Auto-generated method stub System.out.println(this.name+"很有气质!"); } } ~~~ 以上把一个臃肿的接口变更为两个独立的接口所依赖的原则就是接口隔离原则。 接口是我们设计时对外提供的契约,通过分散定义多个接口,可以预防未来变更的扩散,提高系统的灵活性和可维护性。 接口隔离原则是对接口进行的规范约束,有以下四层含义(摘自《设计模式之禅》) 1、接口要尽量小 接口在遵守单一职责原则的基础下,尽可能细化接口的方法。并不是无休止的细化接口。 2、接口要高内聚 高内聚是提高接口、类、模块的处理能力,减少对外的交互。在接口中尽量少公布public方法,接口是对外的承诺,承诺越少对外越有利,变更的风险也就越少,同时有利于降低成本 3、定制服务 根据需求分析,必要时为特殊用户提供定制的接口,尽量避免不同操作人群使用同一接口,这样会降低系统的响应速度和扩展性。 4、接口设计是有限度的 根据开发情景来划分设计接口,在开发过程中设计接口的颗粒度越小,系统灵活性越高。并不是以为的将接口细化。