上一节咱们学习了单一职责原则,简单来讲就是各司其职,厨师就专一作好菜,不要跑到前堂作起小二。app
可是呢,万事无一绝对。若是只是小饭店有时候也不是特别严格。仍是那句话,原则是死的,人是活的。ide
接下来咱们来学习接口隔离原则。学习
客户端不该该依赖它不须要的接口,即一个类对另外一个类的依赖应该创建在最小的接口上。设计
怎么理解呢?code
就是说,一个接口拥有的行为应该尽量的小。接口
若是说这个接口定义了不少方法,可是呢,咱们实现这个接口的时候并不须要这么多的方法。那么你就会发现,除了个别几个你须要的方法实现了,不少不须要的方法也必须得实现了,形成不少空方法的出现。class
这是一种很糟糕的设计,这样作不只会强制实现原本不应实现的方法,最严重的是会给使用者形成假象,即这个实现类拥有接口中全部的行为,结果调用方法时却没收获到想要的结果。扩展
案例以下:jdk
public interface Car { void run(); void fly(); void appearance(); }
public class Audi implements Car { public static void main(String args[]){ Audi audi = new Audi(); audi.run(); audi.appearance(); audi.fly(); } @Override public void appearance() { System.out.println("我奥迪有炫酷的车灯"); } @Override public void run() { System.out.println("我不光能跑,我还跑的很快"); } @Override public void fly() { } }
上诉代码输出结果方法
我不光能跑,我还跑的很快 我奥迪有炫酷的车灯
上诉代码中的接口Car就没有遵循最小接口原则。由于这个接口定义了一个并不属于Car的方法fly()。你在实现这个接口的时候你也必须重写fly()方法。
可是呢,车并无这个功能,因此大部分状况下你会将这个方法重写了可是里面是空方法。
首先代码不简洁。其次当某我的调用该类方法的时候,就会给使用者形成车会飞的假象。
上述代码在JDK1.8版本之后还能能写成这种形式
public interface Car { default void run(){ System.out.println("我能跑"); } default void fly(){ System.out.println(("我不能飞")); } void appearance(); }
public class Audi implements Car { public static void main(String args[]){ Audi audi = new Audi(); audi.run(); //我不光能跑,我还跑的很快 audi.appearance(); //我有炫酷的车灯 audi.fly(); //我不能飞 } @Override public void appearance() { System.out.println("我有炫酷的车灯"); } @Override public void run() { System.out.println("我不光能跑,我还跑的很快"); } }
在jdk1.8之后提供了default关键字,这个关键字的出现让接口可以有默认的实现方式。
好比Car接口的的run()方法和fly()方法实现了default关键字,那么就能直接在接口当中把这个方法给实现了。
当某个类实现了这个接口的时候,就不须要强制重写该方法。
有人就会问了,是否是在1.8版本之后就能够不须要遵循最小接口原则了?答案是否认了。
即使你不须要实现这个方法,可是在使用者眼中,就会给使用者形成车会飞的假象。
固然,仍是那句话,人是活的,规则是死的。不少时候咱们并非说必须百分百按照这种要求来实现咱们的代码。
当你的代码严格实现该原则的时候发现,致使代码的可阅读性,可扩展性下降。甚至逻辑也复杂了不少。那么就能够按照具体的状况违背这种原则。
接口隔离原则和职责单一原则有共同性。你们能够多思考一下。
仍是那句话慢慢的学,一个一个掌握,才更深入,贪多嚼不烂。
下一篇咱们来学习依赖倒转原则。