디자인 패턴 - 전략패턴
2024. 11. 11. 12:53ㆍ카테고리 없음
전략패턴
행동을 캡슐화하여 동적으로 행위를 변경할 수 있도록 하는것이여서 다양한 기능들을 별도의 클래스에 정의하고, 필요에 따라 교체하거나 선택적으로 사용할 수 있다.
전략 패턴 구조
1. 전략 인터페이스: 공통 인터페이스를 정의하여 다양한 전략을 사용할 수 있도록 합니다.
2. 전략 구현체: 인터페이스를 구현한 구체적인 전략 클래스입니다.
3. 컨텍스트: 전략을 설정하고 실행하는 역할을 하는 클래스입니다.
4. 클라이언트: 특정 전략을 선택하고, 컨텍스트를 통해 전략을 실행합니다.
전략 패턴 예시 ( 무기 전략 패턴 )
1. 전략 인터페이스 정의
캐릭터가 사용할 다양한 무기 동작을 정의
// 전략 - 무기 행동을 정의한 인터페이스
public interface IWeapon
{
void Attack();
}
2. 구체적인 전략 구현체들
다양한 무기 전략을 구체화하여 구현
// 무기 전략 구현체 - 검
public class Sword : IWeapon
{
public void Attack()
{
Console.WriteLine("칼을 휘두르다");
}
}
// 무기 전략 구현체 - 방패
public class Shield : IWeapon
{
public void Attack()
{
Console.WriteLine("방패로 밀친다");
}
}
// 무기 전략 구현체 - 석궁
public class Crossbow : IWeapon
{
public void Attack()
{
Console.WriteLine("석궁을 발사하다");
}
}
3. 컨텍스트 클래스 정의
캐릭터가 전략을 설정하고 실행할 수 있도록 하는 클래스
// 컨텍스트 - 무기 전략을 설정하고 실행
public class Character
{
private IWeapon _weapon; // 전략 인터페이스를 합성
// 전략을 설정하는 메서드
public void SetWeapon(IWeapon weapon)
{
_weapon = weapon;
}
// 전략 실행 메서드
public void PerformAttack()
{
if (_weapon != null)
{
_weapon.Attack();
}
else
{
Console.WriteLine("무기를 선택하지 않았습니다.");
}
}
}
4. 클라이언트 코드
클라이언트가 Character 클래스에 전략을 설정하고 호출
public class Program
{
public static void Main(string[] args)
{
// 캐릭터 생성
Character character = new Character();
// 검으로 공격 전략 설정
character.SetWeapon(new Sword());
character.PerformAttack(); // 출력: "칼을 휘두르기"
// 방패로 공격 전략 변경
character.SetWeapon(new Shield());
character.PerformAttack(); // 출력: "방패로 밀치기"
// 석궁으로 공격 전략 변경
character.SetWeapon(new Crossbow());
character.PerformAttack(); // 출력: "석궁을 발사"
}
}
전략 패턴 특징
유연성 : 전략을 쉽게 교체할 수 있다. 새로운 무기를 추가할 때 IWeapon을 구현하는 새로운 클래스만 만들면 된다.
코드 유지보수 : if-else 분기 없이 전략을 객체로 분리해 클린한 코드를 유지한다.
확장성 : if-else 분기 없이 다양한 무기 전략을 관리할 수 있어 코드가 간결해진다.