Tags
- EntityGraph
- fontawesome
- 폰트어썸
- 도커
- Docker
- 옵저버패턴
- Spring Cloud
- QueryDSL
- openapispec
- 라즈베리파이
- 무료 아이콘 폰트
- restdocs
- kotlin
- java_to_kotlin
- Observer Pattern
- with jdk
- 라즈베리파이 클러스터
- 디자인패턴
- restcontroller
- springboot
- 전략패턴
- Spring
- 리믹스아이콘
- remix icon
- OneToMany
- arc browser
- spring cloud contract
- Openjdk
- java
- oraclejdk
Archives
- Today
- Total
< Dev-Kidult />
디자인 패턴 - 전략패턴(Strategy pattern) 본문
전략패턴(strategy pattern)은 위키에서 이렇게 설명하고 있습니다.
-
특정한 계열의 알고리즘들을 정의하고
-
각 알고리즘을 캡슐화하며
-
이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.
동물의 다리를 예로 진행을 해보겠습니다
동물이라면 어떤 동물은 다리가 2개, 4개 혹은 다리가 없는 경우도 있습니다.
전략패턴을 모른다면 우리는 이렇게 구현을 할 것입니다.
public interface Animal {
void reg();
}
public class Tiger implements Animal{
@Override
public void reg() {
System.out.println("난 다리가 4개야");
}
}
public class Bird implements Animal{
@Override
public void reg() {
System.out.println("난 다리가 2개야");
}
}
하지만 나중에 저 호랑이가 다리를 다쳐서 다리가 3개가 된다거나, 유전적 변이가 일어나서 다리가 6개가 된다거나 하면
우리는 저 타이거 클래스에 들어가서 내부 소스를 수정을 해야 할 것입니다.
전략패턴은 교환 가능한 행동을 캡슐화하고 위임을 통해서 어떤 행동을 사용할지 결정한다고 되어있습니다.
저 변하는 다리 부분을 캡슐화를 통해 전략화 시킵니다.
public interface Reg {
void reg();
}
public class TwoReg implements Reg{
@Override
public void reg() {
System.out.println("난 다리가 2개야");
}
}
public class ThreeReg implements Reg {
@Override
public void reg() {
System.out.println("난 다리가 3개야");
}
}
public class FourReg implements Reg {
@Override
public void reg() {
System.out.println("난 다리가 4개야");
}
}
그리고 기존 코드도 맞게 변경을 합니다.
public abstract class Animal {
private Reg reg;
public Animal(Reg reg) {
this.reg = reg;
}
}
public class Tiger extends Animal{
public Tiger(Reg reg) {
super(reg);
}
}
그리고 생성자를 통해 호랑이를 만들 때 다리를 선택해주면 됩니다.
public class Main {
Animal tiger = new Tiger(new FourReg());
Animal threeRegTiger = new Tiger(new ThreeReg());
}
기존에는 호랑이가 다리 숫자가 변경되면 호랑이 클래스의 내부 소스를 변경하여야 됐지만,
지금은 여러 개의 다리 전략들 중 하나를 택하여 만들면 되도록 변경하였습니다.
나중에 추후 또 다리 개수가 변경이 일어나면 단지 전략을 바꿔주기만 하면 됩니다.
예제가 동물의 다리를 바꾸는 것으로 적절치는 않아 보이지만, 이러한 개념으로만 흘러간다라고 개념 정도만 이해해주시면 감사하겠습니다.
반응형
'개발 > Back-end' 카테고리의 다른 글
`Spring cloud contract` 를 배워보자 (0) | 2020.08.14 |
---|---|
JPA OneToMany EAGER 문제 및 해결방안 (0) | 2020.07.30 |
디자인 패턴 - 옵저버패턴(Observer pattern) with jdk (0) | 2019.07.11 |
Open JDK와 Oracle JDK의 차이점 (0) | 2018.10.10 |
Spring에서 @Controller와 @RestController의 차이 (0) | 2018.09.19 |
Comments