만약 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고, 가정하면 두가지 할인방법을 모두 가져와야 한다. 스프링을 사용하면 전략패턴을 매우 간단하게 구현할 수 있다.
우선 이를위한 테스트를 만든다.
package hello.core.autowired;
import hello.core.AutoAppConfig;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.List;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
public class AllBeanTest {
@Test
void findAllBean() {
//스프링 컨테이너 생성하면서 스프링 빈으로 등록하기.
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discountPrice1 = discountService.discount(member, 20000, "fixDiscountPolicy"); //discountCode에 변동할인인지 고정할인인지 표시를함.
assertThat(discountService).isInstanceOf(DiscountService.class);
assertThat(discountPrice1).isEqualTo(1000);
int discountPrice2 = discountService.discount(member, 20000, "rateDiscountPolicy"); //discountCode에 변동할인인지 고정할인인지 표시를함.
assertThat(discountPrice2).isEqualTo(2000);
}
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
@Autowired
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
System.out.println("policyMap = " + policyMap);
System.out.println("policies = " + policies);
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
}