单接口适配器模式是为了让子类实现时屏蔽掉不关心的方法,在子类、适配器、接口之间做一次过渡。比如子类想实现接口中某一个方法,但是接口中方法不止一个,此刻编译器强制子类必须实现该接口的所有方法,这显然是麻烦、不必要且不优雅的。那么此时选择单接口适配器模式则是一种解决方案。
怎么做? 其实特别简单:
就是写一个类,实现某接口,给出默认实现。
其实在JDK8的语法中已经给出了默认实现的方式,就是使用default
关键字。可以说也是一种解决方案,看个人喜好选用。如果低于该版本,则还是选择用适配器吧。
代码示例:
以下代码展示了对spring中org.springframework.core.env.Environment的适配,目的是为了让子类在实现该接口时不必再去实现所有的接口。
public class EnvironmentAdapter implements Environment{
@Autowired
Environment environment;
@Override
public boolean containsProperty(String key) {
return environment.containsProperty(key);
}
@Override
public String getProperty(String key) {
return environment.getProperty(key);
}
@Override
public String getProperty(String key, String defaultValue) {
return environment.getProperty(key, defaultValue);
}
@Override
public <T> T getProperty(String key, Class<T> targetType) {
return environment.getProperty(key, targetType);
}
@Override
public <T> T getProperty(String key, Class<T> targetType, T defaultValue) {
return environment.getProperty(key, targetType, defaultValue);
}
@Override
public <T> Class<T> getPropertyAsClass(String key, Class<T> targetType) {
return environment.getPropertyAsClass(key, targetType);
}
@Override
public String getRequiredProperty(String key) throws IllegalStateException {
return environment.getRequiredProperty(key);
}
@Override
public <T> T getRequiredProperty(String key, Class<T> targetType)
throws IllegalStateException {
return environment.getRequiredProperty(key, targetType);
}
@Override
public String resolvePlaceholders(String text) {
return environment.resolvePlaceholders(text);
}
@Override
public String resolveRequiredPlaceholders(String text)
throws IllegalArgumentException {
return environment.resolveRequiredPlaceholders(text);
}
@Override
public String[] getActiveProfiles() {
return environment.getActiveProfiles();
}
@Override
public String[] getDefaultProfiles() {
return environment.getDefaultProfiles();
}
@Override
public boolean acceptsProfiles(String... profiles) {
return environment.acceptsProfiles(profiles);
}
}
这样子类继承它,重写需要的方法即可。
结论
单接口适配器:就是实现了某接口的类,并对接口中每个方法给出了一个默认实现。
使用场景:简化代码。