1. 스트레티지 패턴 정의
=> 여러 알고리즘을 하나의 추상적인 접근점(인터페이스)을 만들어 접근점에서 알고리즘이 서로 교환 가능하도록 하는 패턴
=> 동일 목적 알고리즘의 선택 적용 문제
=> 인터페이스
=> 기능에 대한 선언(구현과의 분리)
=> 여러가지 기능을 사용하기 위한 단일 통로
=> 사용 예 :
=> 워드 문서에서 프린터, 폰트 사용
=> 프린터기의 종류에 상관없이 프린트 동작, 폰트의 종류에 상관없이 입력하는건 같음
=> 정수 배열에 대해 사용하는 정렬 알고리즘
=> 게임 캐릭터의 무기(교체) 사용
인터페이스를 받고 해당 기능은 꼭 구현해야 한다. 와 같다.
게임에서 무기의 종류는 다양해도 (칼, 창, 단검, 도끼, 방패 등) 공격! 자체의 기능은 똑같은 것과 같다.
(실제로 칼은 2번 휘두름, 단검은 던짐, 창은 1번 찌름 등은 달라도 공격! 하는건 같다는 내용이다.)
유니티에서 확인해보자.
위와 같이 세팅해놨다.
일단 실제 무기가 바뀌는것은 제외하고 무기를 바꾼 후 Attack을 했을 때 잘 바뀌는지를 보려한다.
다음은 코드이다.
// WeaponManager.cs
// GameManager에 추가
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponManager : MonoBehaviour {
MyWeapon myweapon;
void Start() {
myweapon = new MyWeapon();
myweapon.setWeapon(new Sword());
}
public void ChangeSword() {
myweapon.setWeapon(new Sword());
}
public void ChangeSpear() {
myweapon.setWeapon(new Spear());
}
public void ChangeDagger() {
myweapon.setWeapon(new Dagger());
}
public void Attack() {
myweapon.Attack();
}
}
// MyWeapon.cs
public class MyWeapon {
// 접근점
private IWeapon weapon;
// 무기 교체 기능
public void setWeapon(IWeapon weapon) {
this.weapon = weapon;
}
public void Attack() {
// Function Delegate
weapon.Attack();
}
}
// IWeapon.cs
// Interface (여기 있는 기능은 무조건 구현해야 함)
public interface IWeapon {
void Attack();
}
// Sword.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sword : IWeapon {
public void Attack()
{
Debug.Log("검 2번 휘두르기");
}
}
// Spear.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spear : IWeapon {
public void Attack()
{
Debug.Log("창 1번 찌르기");
}
}
// Dagger.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dagger : IWeapon {
public void Attack()
{
Debug.Log("단검 던지기");
}
}
스크립트는 총 6개다. (WeaponManager, MyWeapon, IWeapon, Sword, Spear, Dagger)
WeaponManager를 GameManager에 추가하고
각 버튼에 맞게 WeaponManager에 있는 메소드를 추가하면 된다.
연결 후 실행해보고 무기를 바꿔가며 Attack을 눌러보면 잘 바뀌는 것을 확인할 수 있다.
전에 C#글을 쓰며 interface를 쓴적이 있는데 내용이 비슷했다.
다만 유니티에 적용할 땐 이런식으로 적용이 가능하다는 것을 보면 될 것 같다.
'프로그래밍 > 디자인 패턴' 카테고리의 다른 글
추상 팩토리 패턴 (Abstract Factory Pattern) (0) | 2020.05.31 |
---|---|
팩토리 메서드 패턴 (Factory Method Pattern) (0) | 2020.05.26 |
심플 팩토리 패턴 (Simple Factory Pattern) (0) | 2020.05.24 |
싱글턴 패턴 (Singleton Pattern) (0) | 2020.05.19 |
컴포넌트 패턴 (Component Pattern) (0) | 2020.05.17 |