해결된 질문
작성
·
453
4
안녕하세요 객체지향 개발에 관심이 생겨 공부중인 개발자 입니다.
좋은 강의 잘 듣고 있습니다.
한번에 하나의 할인 정책을 적용하는 경우는 AppConfig에서 지정을 해주면 되는데 만약 동시에 두 개 이상의 할인 정책을 적용하는 경우 어떤 방법으로 구현하면 좋을지 궁금해서 질문드립니다.
아래와 같이 AppConfig에서 제어흐름을 담당하면서 어떤 할인 정책을 적용할지 결정을 한다는 점은 이해했습니다.
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
2. 할인 정책을 모두(정액, 정률) 사용하고 싶은 경우
예를 들어 할인 정책을 적용할 수 있는 쿠폰이 정액, 정률 두 개가 동시에 존재한다고 했을 때 클라이언트의 변경 없이(OCP) 할인정책을 적용하고 싶다면 AppConfig 에서 `discountPolicy()` 메소드를 호출할 때 정률 할인 쿠폰인 경우 `new RateDiscountPolicy()`를 리턴해야하고 정액 할인 쿠폰인 경우 `new FixDiscountPolicy()`를 리턴해줘야 합니다.
2-1. AppConfig 를 인터페이스로 변경하고 구현체를 별도로 생성
public class FixDiscountAppConfig implements AppConfig {
…
}
public class RateDiscountAppConfig implements AppConfig {
…
}
// OrderApp
AppConfig appConfig;
if (“정률할인 쿠폰”) {
appConfig = new RateDiscountAppConfig();
} else If (“정액할인 쿠폰”) {
appConfig = new FixDiscountAppConfig();
}
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();
2.2 AppConfig 내 discountPolicy 메소드 호출 시 파라미터를 넘겨 구분
public DiscountPolicy discountPolicy(String 할인정책) {
if (“정액”.equals(할인정책)) {
return new FixDiscountPolicy();
} else {
return new RateDiscountPolicy();
}
}
한번에 하나의 정책을 적용하는 것보단 동시에 여러 정책을 적용하는 경우가 더 많을 것 같다고 생각이 들었습니다. 이 경우에는 어떤 방식으로 구현하는게 좋은 객체 지향원칙을 지키며 구현하는 것일지 조언을 구하고자 합니다.
답변 1
1
안녕하세요, YUNHA PARK 님. 공식 서포터즈 codesweaver 입니다.
.
2에서 작성한 코드처럼 분기를 주는 방법을 사용합니다.
이런 방법을 '팩토리 패턴'이라고 합니다. 디자인 패턴 중 하나죠.
스스로 해결 방법을 생각해 내시다니 대단합니다 :)
추가로, 파라미터를 String으로 넘겨도 좋지만, Enum으로 정형화 한다면 엉뚱한 값이 들어올 가능성을 없앨 수 있겠죠.
팩토리 패턴과 관련한 추가정보는 아래 링크를 확인해주세요.
https://jusungpark.tistory.com/14
.
감사합니다.
네 답변 감사합니다.
제가 고민하고 있던 내용이 이미 좋은 기술과 이름으로 사용되고 있었군요. ㅎㅎ
이해하기 쉬운 사례가 담긴 블로그글을 소개해 주셔서 감사합니다.
많은 도움이 되었습니다!