이번엔 데코레이터 패턴을 이용해서 무기에 장비 이외에 버프나 장착시 효과를 주는 추가 부품 같은 시스템을 만들어보겠다.
먼저 데코레이터 패턴에 대한 구조를 알아야하는데
위키에 나와있는 데코레이터 패턴을 보자.
출처 - 위키
사진에 보는것 처럼 위키에 나와있는 구조다.
사진 기준으로 설명을 해보자면 Window 를 정의하고있는데
인터페이스가 데코레이팅된 객체와 해당 데코레이터 간의 일관된 메서드 를 유지하는 구현 계약을 설정한다.
(같은 메서드로 구현한다)
데코레이터 클래스는 동작을 향상 시키거나 다른 동작을하게 오버라이딩 까지 할수있다.
이렇게 정의도된 메서드와 데코레이팅된 객체의 전체구조는 프로세스 동작중에 수정되지 않고 행동이나 속성값만 수정된다.
객체에서 데코레이션을 없애고 원래 형태로 돌릴수도있다.
보통 데코레이터 패턴이 사용된 경우는 런타임 중에 데이터 추가를해서 기능을 바꾸거나
또는 서브 클래싱의 대안을 위해서 사용된다.
하지만 데코레이터 패턴은 다양한 객체들이 존재하고 조합 된것이기때문에 디버깅할때 추척에 불리함이 존재하고
코드 자체도 복잡해질수도있다.
먼저 무기를 정의할 interface를 만들어준다.
여기서는 간단하게 정의할 부분이기 떄문에 대미지를 가지고 오는 부분만 작성했다.
public abstract class Weapon
{
public abstract int GetDamage();
}
이후 이제 이 Weapon 을 받아서 정의를해줄 무기를 만들어준다.
public class Sword : Weapon
{
public int damage = 10;
public override int GetDamage()
{
return damage;
}
}
이 Sword는 플레이어한테 장착될 무기이다.
여기서 무기에 대한걸 GetDamage 하면 10을 줄것이다.
그러면 이제 장비에 장착될 부속품을 만들자.
public abstract class WeaponDecorator : Weapon
{
protected Weapon _weapon;
}
기본적으로 장비에 Weapon을 받아서 만들어준다.
public class WeaponBuff : WeaponDecorator
{
public WeaponBuff(Weapon weapon) {
_weapon = weapon;
}
public override int GetDamage()
{
return _weapon.GetDamage() + 5;
}
}
여기서 보면 선언할때 장비를 받고 장비에 + 5데미지 추가 해주는 방식이다.
그타음 테스트 할 플레이어를 만들어준다.
public class PlayerController : MonoBehaviour
{
public Weapon myWeapon;
void Start()
{
myWeapon = new Sword();
Debug.Log(myWeapon.GetDamage());
myWeapon = new WeaponBuff(myWeapon);
Debug.Log(myWeapon.GetDamage());
}
}
장비를 Sword를끼고 데미지 불러온후 WeaponBuff를 추가로 달아서 다시 데미지 보는 로직이다.
10 과 15 가 나온다 아래에 추가로 버프 한번 더 쓰면 역시 20으로 올라간다.
여기에서는 장비를 장착만 하고 제거나 또는 이미 장착한 장비를 관리 제거하는 부분은 따로 기록하지 않았다.
더 궁금하다면 한번 찾아보는걸 추천한다.
실행 결과