전략 패턴(Strategy Pattern)

패턴 요약
전략 패턴은 알고리즘을 별도의 전략 클래스에 캡슐화하고 알고리즘 간의 동적 전환을 허용함으로써 보다 적응 가능하고 유지 관리 가능하며 재사용 가능한 코드를 만들 수 있습니다. 전략 패턴을 이해하고 적용하면 소프트웨어 시스템의 품질과 확장성을 크게 향상시킬 수 있습니다.

사용 시점
같은 기능이지만, 상황에 따라 서로 다른 전략을 가지고 실행되어야 하는 경우에 사용되는 패턴입니다.
객체들이 할 수 있는 동작을 각각의 전략으로 만들어 놓고 동작을 변경해야 한다면 동적으로 전략을 변경하여 동작을 바꾸게 됩니다.
장점
재사용성, OCP 에 위배되지 않고 시스템이 거대해졌을 때 메소드가 중복되는 것을 해결해줄 수 있다.
단점
각각의 알고리즘을 사용하기 위한 전략은 미리 결정되어 있어야 합니다.
각 전략이 증가할 때마다 Class 의 갯수는 계속 늘어나는 구조가 발생하게 됩니다.
예제 코드
이해를 돕기 위해 코드로 예를 들어보면,
동물 울음소리를 정의하기 위한 Interface 를 다음과 같이 정의, 구현을 해둘 수 있겠습니다.
이 Interface 는 전략 패턴에서 상황에 따라 적용하기 위한 알고리즘의 Behavior 입니다.
public interface IMakeSoundBehavior {
public void makeSound()
}
public class Bark implements IMakeSoundBehavior {
public void Bark() {
System.out.println("Bark~");
}
}
public class Meow implements IMakeSoundBehavior {
public void Meow() {
System.out.println("Meow~");
}
}
public class NewSound implements IMakeSoundBehavior {
public void NewSound() {
System.out.println("NewSound~");
}
}
Animal Class 와 Dog, Cat 그리고 UnknownAnimal 을 정의합니다.
각 Animal 은 내부적으로 울음소리 Behavior 를 가지고 있고, 동적으로 set 할 수 있는 method 를 가지게 됩니다.
public abstract class Animal {
private IMakeSoundBehavior makeSoundBehavior;
public Animal(IMakeSoundBehavior makeSoundBehavior) {
this.makeSoundBehavior = makeSoundBehavior;
}
public void applyMakeSound() {
makeSoundBehavior.makeSound();
}
public void setMakeSound(IMakeSoundBehavior soudType) {
this.makeSoundBehavior = soundType;
}
}
public class Dog extends Animal {
public Dog() {
super(new Bark());
}
}
public class Cat extends Animal {
public Cat() {
super(new Meow());
}
}
public class UnknownAnimal extends Animal {
public UnknownAnimal() {
super(new NewSound());
}
}
실행 시점에 Animal Class 로 선언된 dog, cat, unknown 은 미리 정의된 울음소리로 실행될 것입니다.
하지만 상황에 따라 Behavior 설정을 통해 동적으로 변경이 가능해지고, 여기에서는 Unknown Animal 은 실행시에는 Unknown 울음소리를 내다가 마지막에는 Bark Type 의 울음소리로 설정이 가능해집니다.
public class AnimalExample {
public static void main(final String[] arguments) {
Animal dog = new Dog();
dog.applyMakeSound();
Animal cat = new Cat();
cat.applyMakeSound();
Animal unknown = new UnknownAnimal();
unknown.applyMakeSound();
//! 상황에 따라서 울음소리를 변경할 수 있다.
unknown.setMakeSound(new Bark());
unknow.applyMakeSound();
}
}
동물로 예를 들어 설명하다보니 이해가 가면서도 어색한 부분도 있는 것 같은데, 더 좋은 예가 생각나면 업데이트 하도록 하겠습니다.
Head First Design Patterns 책에서와 같이 다양한 오리(Duck) 에 대한 Class 정의에서 날 수 있는 오리와 날지 못하는 오리등으로 Fly( ) 전략이 변경되는 경우나 게임 캐릭터가 무기를 변경하고 무기에 따라 다른 동작을 하는 방식도 전략 변경의 예가 될 수 있을 것 같습니다.
읽어주셔서 감사합니다.
'IT > SW Architecture' 카테고리의 다른 글
| 디자인 패턴 : GoF (Gang of Four) Design Patterns (0) | 2023.05.27 |
|---|---|
| 웹에서 다이어그램 그리기 - draw.io (0) | 2023.04.21 |
| [SW 설계] Principles of SW Design - SOLID (0) | 2023.04.20 |
| SW 개발과 Architecture 에 대한 단상 (0) | 2023.04.19 |