Java Interface
接口(interface)可以用来产生一个完全抽象的类,它只确定方法名、参数列表及返回值,而不提供任何具体实现(JDK8 中接口可以有默认实现)。接口常被用作建立类与类之间的协议。
接口的特点
接口可以包含域,但会被隐式的设置为 static & final
因为这个特点,接口是一种很便捷的用来创建常量组的工具,但是自从 JDK5 添加了 enum 枚举类之后,便很少使用接口的方式去创建常量组了。接口中的方法默认是 public 的,因此接口中最好不要对方法添加任何修饰符
- 可以通过继承来扩展接口,而且一个接口可以继承多个接口,但是类则只能继承一个
接口的使用
“策略设计模式”是接口的一种常见用法
所谓 “策略设计模式” 即创建一个能够根据所传递的参数对象的不同而具有不同行为的方法。如果方法参数为一个接口类型,那么传入不同的该接口的实现类,该方法所表现出的行为则会有所不同(因为不同的实现类有不同的实现方法)。通过实现多个接口从而实现多重继承。多重继承时,对象可以向上转型为任何一个基类型。这是使用接口的核心原因。
使用 “工厂方法设计模式” 使接口与实现完全分离
工厂方法设计模式是生成遵循某个接口的对象的典型方式。通过这种方式代码将完全与接口的实现分离,这样就可以透明的将某个实现替换为另一个实现。下面是一个展示工厂方法的示例:
interface Service { void method1(); void method2(); }
interface ServiceFactory { Service getService(); }
class impl1 implements Service{
@Override
public void method1() {System.out.println("impl1.method1");}
@Override
public void method2() {System.out.println("impl1.method2");}
}
class impl1Factory implements ServiceFactory{
@Override
public Service getService() {
return new impl1();
}
}
class impl2 implements Service{
@Override
public void method1() {System.out.println("impl2.method1");}
@Override
public void method2() {System.out.println("impl2.method2");}
}
class impl2Factory implements ServiceFactory{
@Override
public Service getService() {
return new impl2();
}
}
public class Factories {
public static void serviceConsumer(ServiceFactory serviceFactory){Service service = serviceFactory.getService();
service.method1();
service.method2();}
public static void main(String[] args) {
serviceConsumer(new impl1Factory());
serviceConsumer(new impl2Factory());
}
}
总结
类设计恰当的原则应该是优先选择类而不是接口,当慢慢的使用接口的必要性越来越明确的时候再进行重构,而不是只要有可能就去创建接口和工厂,去增加其实不必要的抽象性。