在Java项目里,当业务需要根据不同条件执行不同逻辑时,很多初学者会用if else去硬编码创建各个实现类。这种做法在类变多以后极难维护。接口统一访问模式的核心是先定义统一接口,再让不同条件对应的类都实现它,最后通过某种机制按条件挑选实现,调用方只依赖接口。

定义统一接口与具体实现
我们先声明一个处理器接口,所有条件分支对应的类都实现该接口,保证方法签名一致。
// 统一处理器接口
public interface OrderHandler {
String type();
void handle(String orderId);
}
// 普通订单处理
public class NormalOrderHandler implements OrderHandler {
@Override
public String type() {
return "normal";
}
@Override
public void handle(String orderId) {
System.out.println("处理普通订单: " + orderId);
}
}
// VIP订单处理
public class VipOrderHandler implements OrderHandler {
@Override
public String type() {
return "vip";
}
@Override
public void handle(String orderId) {
System.out.println("处理VIP订单: " + orderId);
}
}
基于Map的工厂模式动态选择
把所有的实现类按条件标识放入Map,调用时直接通过key获取,避免分支判断。
import java.util.HashMap;
import java.util.Map;
public class HandlerFactory {
private static final Map<String, OrderHandler> MAP = new HashMap<>();
static {
MAP.put("normal", new NormalOrderHandler());
MAP.put("vip", new VipOrderHandler());
}
public static OrderHandler get(String type) {
OrderHandler handler = MAP.get(type);
if (handler == null) {
throw new IllegalArgumentException("未知订单类型: " + type);
}
return handler;
}
}
// 使用方式
public class Client {
public static void main(String[] args) {
OrderHandler handler = HandlerFactory.get("vip");
handler.handle("1001");
}
}
借助Spring注入实现更优雅的选择
在Spring环境中,可以让容器自动收集所有OrderHandler实现,再用条件匹配。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component
public class SpringHandlerChooser {
private final Map<String, OrderHandler> handlerMap;
@Autowired
public SpringHandlerChooser(List<OrderHandler> handlers) {
this.handlerMap = handlers.stream()
.collect(Collectors.toMap(OrderHandler::type, h -> h));
}
public OrderHandler choose(String type) {
return handlerMap.get(type);
}
}
不同实现方式对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| if else硬编码 | 简单直接 | 难扩展,耦合高 |
| Map工厂 | 去除分支,易扩展 | 需手动注册 |
| Spring注入 | 自动收集,零手动注册 | 依赖容器环境 |
小结
接口统一访问模式通过面向接口编程与动态选择,让条件分支从调用方消失。小项目可用Map工厂,Spring项目推荐容器注入,两者都明显优于散落的if else。