전략 패턴
전략 패턴(Strategy pattern)은 소프트웨어 개발에서 일반적으로 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 객체 지향 프로그래밍에서 다양한 알고리즘을 정의하고 각각을 캡슐화하여 이들을 서로 교환 가능하도록 만듭니다.
전략 패턴을 사용하면 런타임 시에 알고리즘을 선택할 수 있으며, 이를 통해 다양한 알고리즘을 쉽게 추가하거나 변경할 수 있습니다. 이 패턴은 알고리즘을 호출하는 클라이언트와 알고리즘을 구현하는 클래스를 분리하여 유연성을 제공하며, 재사용 가능한 코드를 작성할 수 있도록 도와줍니다.
전략 패턴은 일반적으로 인터페이스를 사용하여 알고리즘을 정의하고, 이 인터페이스를 구현하는 다양한 클래스를 만듭니다. 클라이언트는 이러한 클래스 중 하나를 선택하여 알고리즘을 실행할 수 있습니다. 이러한 방식으로 전략 패턴은 객체 지향 설계의 다형성 개념을 활용하여 코드의 유연성과 재사용성을 높이는 데 도움을 줍니다.
예를 들어, 우리는 다양한 Move 알고리즘이 필요한 프로그램을 작성하고 있다고 가정해 봅시다. 이러한 알고리즘 중에는 걷기, 뛰기 등이 있을 수 있습니다.
이러한 알고리즘을 전략 패턴을 사용하여 구현할 수 있습니다. 먼저, 각각의 Move 알고리즘을 실행하는 인터페이스를 만듭니다.
public interface MoveStrategy {
public void move();
}
이제, 캐릭터를 이동시키는 구체적인 알고리즘을 구현하는 클래스를 만들어봅시다. 여기서는 캐릭터를 걷거나 뛰게 하는 두 가지 방식으로 알고리즘을 구현해보겠습니다.
public class WalkStrategy implements MoveStrategy {
@Override
public void move() {
System.out.println("걷는 중입니다.");
}
}
public class RunStrategy implements MoveStrategy {
@Override
public void move() {
System.out.println("뛰는 중입니다.");
}
}
마지막으로, 이동 방식을 선택하는 캐릭터 클래스를 만들어봅시다. 이 클래스는 선택한 이동 방식에 따라 캐릭터를 이동시킵니다.
public class Character {
private MoveStrategy moveStrategy;
public void setMoveStrategy(MoveStrategy moveStrategy) {
this.moveStrategy = moveStrategy;
}
public void move() {
moveStrategy.move();
}
}
위 코드에서 setMoveStrategy() 메소드는 이동 방식을 변경하기 위한 메소드입니다. move() 메소드는 현재 선택된 이동 방식에 따라 캐릭터를 이동시킵니다.
이제, 다음과 같이 클라이언트 코드에서 사용할 수 있습니다.
public class Client {
public static void main(String[] args) {
Character character = new Character();
// 걷기로 설정
character.setMoveStrategy(new WalkStrategy());
character.move();
// 뛰기로 설정
character.setMoveStrategy(new RunStrategy());
character.move();
}
}
위 코드에서는 먼저 걷기 방식을 선택하여 캐릭터를 이동시키고, 그 다음으로 뛰기 방식을 선택하여 캐릭터를 이동시킵니다. 이처럼 전략 패턴을 사용하면 런타임 시에 이동 방식을 변경할 수 있으므로, 캐릭터의 이동 방식을 쉽게 변경할 수 있습니다.
전략패턴은 OCP 관점에 보면 확장에 해당하는 변하는 부분을 별도의 클래스로 만들어 추상화된 인터페이스를 위임하는 방식.
※ Context : Character 클래스
※ Strategy : MoveStrategy 클래스
- Context 는 구체적인 전략 중 하나에 대한 참조를 유지하며, 이 객체[구체적인 전략]와는 오직 전략 인터페이스를 통해서만 소통합니다."
- Strategy 인터페이스는 모든 구체적 전략에 공통적입니다. 이것은 Context가 전략을 실행하기 위해 사용하는 메소드를 선언합니다."
- Concrete Strategies 은 Context가 사용하는 알고리즘의 다양한 변형을 구현합니다.
- Context 는 알고리즘을 실행할 필요가 있을 때마다 Context와 연결[참조]된 전략 객체에 실행 메소드를 호출합니다. 컨텍스트는 자신이 어떤 종류의 전략을 사용하고 있는지, 또는 알고리즘이 어떻게 실행되는지 모릅니다.