스트래티지 패턴(Strategy Pattern)

2022. 3. 29. 23:15디자인패턴

스트래티지 패턴은 행위(알고리즘, 메소드)를 캡슐화하여 이를 동적으로 바꿀 수 있게 해주는 패턴이다.

 

Strategy: 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시한다.

ConcreteStrategy1, ConcreteStrategy2,...: 스트래티지 패턴에서 명시한 알고리즘을 실제로 구현한 클래스다.

Context: 스트래티지 패턴을 이용하는 역할을 수행한다. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setterMethod()를 제공한다.

 

Animal cat = new Cat("kitty");
Animal dog = new Dog("badook");

dog.SetSoundStrategy(new BarkStrategy());
dog.SetEatStrategy(new DogFood());

cat.SetSoundStrategy(new MeowStrategy());
cat.SetEatStrategy(new CatFood());

Console.WriteLine("My name is " + dog.GetName());
dog.Sound();
dog.Eat();

Console.WriteLine("\n");

Console.WriteLine("My name is " + cat.GetName());
cat.Sound();
cat.Eat();

Console.WriteLine("\n");

dog.SetSoundStrategy(new MeowStrategy());

Console.WriteLine("My name is " + dog.GetName());
dog.Sound();
dog.Eat();

public abstract class Animal
{
    private string name;
    private SoundStrategy? s_strategy;
    private EatStrategy? e_strategy;

    public Animal(string name)
    {
        this.name = name;
    }

    public string GetName()
    {
        return name;
    }

    public void Sound()
    {
        s_strategy.Sound();
    }

    public void Eat()
    {
        e_strategy.Eat();
    }

    public void SetSoundStrategy(SoundStrategy soundStrategy)
    {
        this.s_strategy = soundStrategy;
    }

    public void SetEatStrategy(EatStrategy eatStrategy)
    {
        this.e_strategy = eatStrategy;
    }
}

public class Cat : Animal
{
    public Cat(string name) : base(name)
    {

    }
}

public class Dog : Animal
{
    public Dog(string name) : base(name)
    {

    }
}

public interface SoundStrategy
{
    public void Sound();
}

public interface EatStrategy
{
    public void Eat();
}

public class BarkStrategy : SoundStrategy
{
    void SoundStrategy.Sound()
    {
        Console.WriteLine("왕왕 짖습니다.");
    }

}

public class MeowStrategy : SoundStrategy
{
    void SoundStrategy.Sound()
    {
        Console.WriteLine("냥냥 웁니다.");
    }
}

public class DogFood : EatStrategy
{
    void EatStrategy.Eat()
    {
        Console.WriteLine("강아지 사료를 먹습니다.");
    }
}

public class CatFood : EatStrategy
{
    void EatStrategy.Eat()
    {
        Console.WriteLine("고양이 사료를 먹습니다.");
    }
}

 

결과

dog나 cat의 코드를 변경하지 않고 전략을 변경할 수 있으며 새로운 전략을 추가 해야되는 경우에도 기존 코드를 수정하지 않고 새로운 전략 클래스를 작성하면 된다.

'디자인패턴' 카테고리의 다른 글

옵저버 패턴(Observer Pattern)  (0) 2022.04.05
커맨드 패턴(Command Pattern)  (0) 2022.04.04
스테이트 패턴(State Pattern)  (0) 2022.04.04
싱글턴 패턴(Singleton Pattern)  (0) 2022.04.01
클래스 다이어그램  (0) 2022.03.29