反例:动物接口中定义的方法并不是被所有动物需要的
interface Animal{ void eat(); void fly(); void swim(); } class Bird implements Animal{ @Override public void eat() { System.out.println("吃"); } @Override public void fly() { System.out.println("飞"); } //======鸟不会游泳,并不需要实现 @Override public void swim() { System.out.println("游泳"); } }
正例:接口抽象出有意义的层级,供需要的类去实现
interface Flyable{ void fly(); } interface Swimable{ void swim(); } interface Eatable{ void eat(); } class Bird implements Flyable,Eatable{ ..... } class Dog implements Swimable,Eatable{ ..... }
客户端不应该依赖那些它不需要的接口。
一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可