IT/SW Architecture

디자인 패턴 : Strategy Pattern

Uncle D. 2023. 5. 27. 21:30
반응형

전략 패턴(Strategy Pattern) 

 

 

Strategy_Pattern_in_UML (출처:위키피디아)

패턴 요약

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

Design_Strategy_Design_Pattern_UML (출처:위키피디아)

사용 시점

같은 기능이지만, 상황에 따라 서로 다른 전략을 가지고 실행되어야 하는 경우에 사용되는 패턴입니다.

객체들이 할 수 있는 동작을 각각의 전략으로 만들어 놓고 동작을 변경해야 한다면 동적으로 전략을 변경하여 동작을 바꾸게 됩니다.

 

장점

재사용성, 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( ) 전략이 변경되는 경우나 게임 캐릭터가 무기를 변경하고 무기에 따라 다른 동작을 하는 방식도 전략 변경의 예가 될 수 있을 것 같습니다. 

 

읽어주셔서 감사합니다.

반응형