전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴
전략 = 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비지니스 규칙, 문제를 해결하는 알고리즘
유사한 행위들을 캡슐화하여, 객체의 행위를 바꾸고 싶은 경우 직접 변경하는 것이 아닌, 전략만 변경하여 유연하게 확장하는 패턴
• 무엇이 변화되었는지를 찾은 후에 이를 클래스로 캡슐화
• 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 필요할 때 교체 가능
• SOLID 중 OCP와 DIP 따름
• 다음의 3가지가 있어야 함.
- 전략 메소드를 가진 객체
- 전략 객체를 사용하는 컨텍스트
- 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트
- Strategy : 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시
- ConcreteStrategy1, ConcreteStrategy2 : 스트래티지 패턴에서 명시한 알고리즘을 실제로 구현한 클래스
- Context : 스트래티지 패턴을 이용하는 역할 수행. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 satter 메소드 제공
예시코드
/* Robot.class - 전략 객체를 사용하는 컨텍스트 */
public abstract class Robot {
private String name;
private MovigStrategy movingStrategy;
public Robot(String name){
this.name = name;
}
public String getName(){
return name;
}
public void move(){
movingStrategy.move();
}
public void setMovingStrategy(MovingStrategy movingStrategy){
this.movingStrategy = movingStrategy;
}
}
public class Atom extends Robot {
public Atom(String name){
super(name);
}
}
public class TaekwonV extends Robot {
public TaekwonV(String name){
super(name);
}
}
/* 전략 메소드를 가진 객체 */
interface MovingStrategy {
public void move();
}
public class FlyingStrategy implements MovingStrategy {
public void move(){
System.out.println("I can fly");
}
}
public class WalkingStrategy implements MovingStrategy {
public void move(){
System.out.println("I can only walk.");
}
}
/* 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트 */
public class Client {
public static void main(String args[]){
Robot taekwonV = new TaekwonV("TaekwonV");
Robot atom = new Atom("Atom");
taekwonV.setMovingStrategy(new WalkingStrategy());
atom.setMovingStrategy(new FlyingStrategy());
tackwonV.move();
atom.move();
}
}
'Design pattern' 카테고리의 다른 글
[Design Pattern] Observer Pattern (0) | 2022.08.04 |
---|---|
[Design Pattern] Command Pattern (0) | 2022.08.01 |
[Design Pattern] State Pattern (0) | 2022.07.25 |
[Design Pattern] Singleton Pattern (0) | 2022.07.20 |
[Design Pattern] SOLID 원칙 (0) | 2022.07.01 |