引言:
接口的作用是
like
-a关系,也即是是个啥---从属关系,也就是你走在大街上饿了,想吃饭了,也就是你想用哪个类的时候总不能到处找吧,这个时候肯德基的招牌就有用了,你至少知道他是个吃饭的地方,所以接口类似招牌,具体的动作在具体的类中实现,为何你不写项目的时候就搞个”字典“接口呢,一这个接口意义不明确,二就是因为java里面每个类实现了接口需要完全实现方法,所以你的类根本不会使用某些方法的时候会显得臃肿。
如图:
public interface interfaceAll {
public void m1();
public void m2();
public void m3();
}
客户A:
public class ClientAClass {
public void useA1(interfaceAll i){
i.m1();
}
public void useA2(interfaceAll i){
i.m2();
}
}
给A客户的类:
public class AClass implements interfaceAll{
@Override
public void m1() {
System.out.println("m1!");
}
@Override
public void m2() {
System.out.println("m2!");
}
@Override
public void m3() {
//no use!
}
}
客户B:
public class ClientBClass {
public void useA1(interfaceAll i){
i.m1();
}
public void useA3(interfaceAll i){
i.m3();
}
}
给B客户的类:
public class BClass implements interfaceAll{
@Override
public void m1() {
//no use!
}
@Override
public void m2() {
System.out.println("m2!");
}
@Override
public void m3() {
System.out.println("m3!");
}
}
可见,在具体的实现类中有些方法根本用不到,非常不好看
需要改善:
public interface interface1 {
public void m1();
}
public interface interface2 {
public void m2();
}
public interface interface3 {
public void m3();
}
public class BClass2 implements interface2,interface3{
@Override
public void m3() {
System.out.println("m3!");
}
@Override
public void m2() {
System.out.println("m2!");
}
}
public class AClass2 implements interface1,interface2{
@Override
public void m2() {
System.out.println("m2!");
}
@Override
public void m1() {
System.out.println("m1!");
}
}
这样实现类的招牌就非常明确了。
表现:
1,高内聚:也就是你使用一个类的打印一句话的方法,作为你来说你只用打印这个方法,在接口中这个方法的数据来源,判断等等有接口其他方法提供,并且是private,这个减少了对外的交互,客户更加简单,接口内的方法做一件事更明确。
2,接口大小适度:过小,导致实现类过多,过大,导致实现类臃肿。
3,专注服务:如果你发现你写的接口因为大了,让客户用到了不该用的方法,这个时候就要考虑把接口细分,客户要用的方法给他就好,不用的就藏起来。