전략패턴은 대표적으로 다음과 같은 장점을 가집니다.
import context.VendingMachine;
import strategy.impl.ColaVendingStrategy;
import strategy.impl.WaterVendingStrategy;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
VendingMachine machine = new VendingMachine();
machine.setVendingStrategy(new WaterVendingStrategy());
machine.vend();
machine.setVendingStrategy(new ColaVendingStrategy());
machine.vend();
}
}
package context;
import strategy.VendingStrategy;
public class VendingMachine {
private VendingStrategy vendingStrategy;
public void setVendingStrategy(VendingStrategy strategy) {
this.vendingStrategy = strategy;
}
public void vend() {
vendingStrategy.vend();
}
}
package strategy;
public interface VendingStrategy {
void vend();
}
package strategy.impl;
import strategy.VendingStrategy;
public class WaterVendingStrategy implements VendingStrategy {
@Override
public void vend() {
System.out.println("생수");
}
}
package strategy.impl;
import strategy.VendingStrategy;
public class ColaVendingStrategy implements VendingStrategy {
@Override
public void vend() {
System.out.println("콜라");
}
}
@RestController
public class AuthController {
private final Map<String, AuthService> authServices;
private final String serviceSuffix;
...
@Autowired
public AuthController(
Map<String, AuthService> authServices,
...
) {
this.authServices = authServices;
this.serviceSuffix = "AuthService";
...
}
@GetMapping("/auth/{provider}/client-id")
public ResponseEntity<?> getClientId(
@PathVariable String provider
) {
AuthService service = getServiceForProvider(provider);
...
}
@PostMapping("/auth/{provider}")
public ResponseEntity<?> authenticateViaGitHub(
@RequestBody XXXOAuth2Dto dto,
@PathVariable String provider
) {
AuthService service = getServiceForProvider(provider);
...
}
private AuthService getServiceForProvider(String provider) {
return authServices.computeIfAbsent(
provider + AuthService.class.getSimpleName(),
key -> {
throw new RuntimeException();
}
);
}
}
OAuth2
를 이용한 인증과정을 예시로 들 수 있습니다.provider
경로 변수를 받아 serviceSuffix
와 결합해 미리 주입받은 빈 이름으로 서비스레이어 구현체를 찾는 방식입니다.Map<String, {Interface}>
형태로 미리 주입받을 수 있습니다.AuthController
가 컨텍스트가 되고 AuthService
가 전략 인터페이스, 그 구현체들이 구체적인 전략의 구현체가 될 수 있습니다.간단하게 전략패턴에 대해 자바코드와 스프링 코드 예시로 소개했습니다.
혹시나 오류가 발생한다거나 결과가 올바르지 않다면 중간에 오탈자는 없었는지, 빠진건 없는지 한번 다시 확인해 주시고 이해가 안되는 부분이 있다면 댓글로 남겨주시면 확인하는 대로 답변 달겠습니다.