728x90
반응형
Strategy Pattern
여러 알고리즘을 캡슐화하고 상호교환 가능하게 만드는 패턴
컨텍스트에서 사용할 알고리즘을 클라이언트에서 선택한다.
BEFORE
Client
public class Client {
public static void main(String[] args) {
BlueLightRedLight blueLightRedLight = new BlueLightRedLight(3);
blueLightRedLight.blueLight();
blueLightRedLight.redLight();
}
}
BlueLightRedLight
public class BlueLightRedLight {
private int speed;
public BlueLightRedLight(int speed) {
this.speed = speed;
}
public void blueLight() {
if (speed == 1) {
System.out.println("무 궁 화 꽃 이");
} else if (speed == 2) {
System.out.println("무궁화꽃이");
} else {
System.out.println("무광꼬치");
}
}
public void redLight() {
if (speed == 1) {
System.out.println("피 었 습 니 다.");
} else if (speed == 2) {
System.out.println("피었습니다.");
} else {
System.out.println("피어씀다");
}
}
}
AFTER
Client
public class Client {
public static void main(String[] args) {
BlueLightRedLight game = new BlueLightRedLight();
game.blueLight(new Normal()); // 기본 속도로 출력
game.redLight(new Fastest()); // 가장 빠른 속도로 출력
game.blueLight(new Speed() { // 새로 오버라이드하여 변경한 문구로 출력
@Override
public void blueLight() {
System.out.println("blue light");
}
@Override
public void redLight() {
System.out.println("red light");
}
});
}
}
BlueLightRedLight
public class BlueLightRedLight {
public void blueLight(Speed speed) {
speed.blueLight();
}
public void redLight(Speed speed) {
speed.redLight();
}
}
Speed - Normal, Faster, Fastest
public interface Speed {
void blueLight();
void redLight();
}
public class Normal implements Speed {
@Override
public void blueLight() {
System.out.println("무 궁 화 꽃 이");
}
@Override
public void redLight() {
System.out.println("피 었 습 니 다.");
}
}
public class Faster implements Speed {
@Override
public void blueLight() {
System.out.println("무궁화꽃이");
}
@Override
public void redLight() {
System.out.println("피었습니다.");
}
}
public class Fastest implements Speed{
@Override
public void blueLight() {
System.out.println("무광꼬치");
}
@Override
public void redLight() {
System.out.println("피어씀다.");
}
}
[패턴 복습]
장점 | 단점 |
- 새로운 전략을 추가하더라도 기존 코드를 변경하지 않는다. - 상속 대신 위임을 사용할 수 있다. - 런타임에 전략을 변경할 수 있다. |
- 복잡도가 증가한다. - 클라이언트 코드가 구체적인 전략을 알아야 한다. |
[실무에서 쓰이는 경우]
- java
- Comparator
- 스프링
- ApplicationContext
- PlatformTransactionManager
728x90
반응형
'Design Patterns > 행동(Behavioral)' 카테고리의 다른 글
[Visitor]방문자 패턴 (0) | 2022.11.22 |
---|---|
[Template method]템플릿메소드패턴 (0) | 2022.11.22 |
[State]상태 패턴 (0) | 2022.11.22 |
[Observer]옵저버패턴 (0) | 2022.11.08 |
[Memento]메멘토패턴 (0) | 2022.11.03 |