Prefácio
Descrição do relacionamento: PayService é a interface de pagamento e o principal método de negócios é epay(). Essa interface possui várias classes de implementação diferentes.
Requisitos: A lógica de qual classe de implementação precisa ser decidida dinamicamente em tempo de execução.
solução
Primeiro, o código do produto final:
@Service
public class RouteService {
@Autowired
Set<PayService> payServiceSet;
Map<String, PayService> payServiceMap;
public PayResult epay(PayRequest payRequest) {
PayService payService = payServiceMap.get(payRequest.getChannelNo());
return payService.epay(payRequest);
}
@PostConstruct
public void init() {
for (PayService payService : payServiceSet) {
payServiceMap = new HashMap<>();
payServiceMap.put(payService.channel(), payService);
}
}
}
análise de código
Usar Set<PayService>
um tipo fará com que o Spring PayService
injete todas as classes que implementam a interface no Set.
@Autowired
Set<PayService> payServiceSet;
Map<String, PayService>
Usado para salvar o relacionamento de mapeamento entre classes de implementação e lógica de julgamento de chamada.
Map<String, PayService> payServiceMap;
O método init decorado com @PostConstruct
anotações será executado automaticamente quando o contêiner Spring for iniciado, onde o mapa de mapeamento é construído.
O método payService channel()
vem da definição da interface. A interface PayService requer que cada classe de implementação implemente este método, e este método retornará o identificador exclusivo de diferentes classes de implementação.
@PostConstruct
public void init() {
for (PayService payService : payServiceSet) {
payServiceMap = new HashMap<>();
payServiceMap.put(payService.channel(), payService);
}
}
Ao chamar, o parâmetro de solicitação deve carregar um identificador exclusivo para indicar qual classe de implementação precisa ser usada para esta chamada, que é o valor da Chave no mapa de mapeamento acima.
public PayResult epay(PayRequest payRequest) {
PayService payService = payServiceMap.get(payRequest.getChannelNo());
return payService.epay(payRequest);
}
Artigo de referência
Implemente rapidamente o padrão de estratégia usando injeção automática Spring