스트래티지 패턴(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 |