1. 정의
ㆍ특정 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.
2. 예시
공통된 부분은 놔두고 차이점을 발생시키는 부분을 캡슐화시켜 사용하는 것을 전략 패턴이라고 합니다.
ㆍ기본 계산기가 있고 공학 계산기를 만든다고 할 때, 기본 연산 기능들은 놔두고 공학 계산 부분을 따로 빼서 정의한다.
ㆍ커피 머신이 있고, 기본 내리는 방식에 커피마다 내리는 방식을 빼서 정의한다.
ㆍ가게 운영을 하는데 손님마다 결재 방식이 다를 때.(특정 할인율, 지불 방식) 등등~
3. 구현
저는 게임 개발자이니 간단하게 게임 플레이어에 대한 전략 패턴을 사용해보겠습니다.
우선 무기를 바꾸는 부분을 캡슐화하여 사용해보는 예시입니다.
※ 플레이어 클래스 및 무기 인터페이스 선언
// 무기들은 무기를 사용한다는 함수를 구현해야만 한다.
public interface WeaponBehavior
{
public void useWeapon();
}
public class Player
{
// SetWeapon으로 상속받는 객체에서 무기를 설정하기 위한 변수
protected WeaponBehavior weaponBehavior;
// 직업 생성 시, 발생하는 직업 정보
protected string name;
protected int attack;
protected int range;
protected int defense;
protected int speed;
// Weapon들의 인터페이스로 구현된 useWeapon()을 사용.
public void fight()
{
weaponBehavior.useWeapon();
}
// 무기 변환 시, 처리
public void SetWeapon(WeaponBehavior wb)
{
weaponBehavior = wb;
}
//================== 아래부터 클래스 구현 부분입니다. ==================
// 직업 이름을 초기화
public void SetClassInfo(string name, int attack, int range, int defence, int speed)
{
this.name = name;
this.attack = attack;
this.range = range;
this.defense = defence;
this.speed = speed;
}
// 직업 정보 출력
public void ShowInfo()
{
Console.WriteLine("클래스 이름 : {0}", name);
Console.WriteLine("클래스 공격력 : {0}", attack);
Console.WriteLine("클래스 사거리 : {0}", range);
Console.WriteLine("클래스 방어력 : {0}", defense);
Console.WriteLine("클래스 이동속도 : {0}", speed);
}
}
※ 무기 설정
// 무기에 맞는 useWeapon을 설정한다.
public class sword : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("검을 사용 합니다.");
}
}
public class gun : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("총을 사용 합니다.");
}
}
public class spear : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("창을 사용 합니다.");
}
}
public class gunlance : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("건랜스를 사용 합니다.");
}
}
public class gauntlet : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("건틀렛을 사용 합니다.");
}
}
public class staff : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("지팡이를 사용 합니다.");
}
}
public class hammer : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("해머를 사용 합니다.");
}
}
public class tarotcard : WeaponBehavior
{
public void useWeapon()
{
Console.WriteLine("카드를 사용 합니다.");
}
}
※ 메인에서 구현 확인
public class MainGame
{
static void Main()
{
Player player = new Player();
Console.WriteLine("---------------------------------------------------");
Console.WriteLine("무기를 교체하는 부분.");
Console.WriteLine("---------------------------------------------------");
player.SetWeapon(new sword());
player.fight();
player.SetWeapon(new gun());
player.fight();
player.SetWeapon(new spear());
player.fight();
player.SetWeapon(new gunlance());
player.fight();
player.SetWeapon(new gauntlet());
player.fight();
player.SetWeapon(new staff());
player.fight();
player.SetWeapon(new hammer());
player.fight();
player.SetWeapon(new tarotcard());
player.fight();
}
}

+@ 고유 무기를 가지고 있는 클래스를 구현
// 직업 생성 시, 정해진 무기와 직업명을 초기화 시켜준다.
public class Berserker : Player
{
public Berserker()
{
SetWeapon(new sword());
SetClassInfo("버서커", 80, 60, 60, 40);
}
}
public class DevilHunter : Player
{
public DevilHunter()
{
SetWeapon(new gun());
SetClassInfo("데빌헌터", 70, 60, 50, 40);
}
}
public class SpearMan : Player
{
public SpearMan()
{
SetWeapon(new spear());
SetClassInfo("창술사", 60, 60, 60, 50);
}
}
public class Warload : Player
{
public Warload()
{
SetWeapon(new gunlance());
SetClassInfo("워로드", 60, 20, 90, 20);
}
}
public class Battlemaster : Player
{
public Battlemaster()
{
SetWeapon(new gauntlet());
SetClassInfo("배틀마스터", 80, 20, 40, 90);
}
}
public class Summoner : Player
{
public Summoner()
{
SetWeapon(new staff());
SetClassInfo("서머너", 60, 80, 20, 30);
}
}
public class Destroyer : Player
{
public Destroyer()
{
SetWeapon(new hammer());
SetClassInfo("디스트로이어", 90, 60, 70, 10);
}
}
public class Arcana : Player
{
public Arcana()
{
SetWeapon(new tarotcard());
SetClassInfo("아르카나", 90, 50, 10, 60);
}
}
※ 메인에서 확인
public class MainGame
{
static void Main()
{
Player player1 = new Berserker();
Player player2 = new DevilHunter();
Player player3 = new SpearMan();
Player player4 = new Warload();
Player player5 = new Battlemaster();
Player player6 = new Summoner();
Player player7 = new Destroyer();
Player player8 = new Arcana();
List<Player> players = new List<Player>();
players.Add(player1);
players.Add(player2);
players.Add(player3);
players.Add(player4);
players.Add(player5);
players.Add(player6);
players.Add(player7);
players.Add(player8);
for(int i = 0; i < players.Count; i++)
{
players[i].fight();
players[i].ShowInfo();
Console.WriteLine("---------------------------------------------------");
}
}
}

'Design Pattern > GOF(Gang Of Four)' 카테고리의 다른 글
| C# - 옵저버 패턴(Observer Pattern) (0) | 2022.08.24 |
|---|