개인 공부/디자인패턴

디자인패턴 데코레이터

smallship 2024. 7. 15. 14:18

데코레이터 패턴은 구조를 수정하지 않고도 객체에 새로운 책임을 동적으로 부여할 수 있는 구조적 디자인 패턴이다.

이 패턴은 같은 클래스의 다른 인스턴스에 영향을 주지 않고 객체에 기능을 추가해야 할 때 특히 유용하다.

 

주요 구성 요소

  • Component: 기본 기능을 정의하는 인터페이스나 추상 클래스
  • ConcreteComponent: Component를 구현한 실제 객체
  • Decorator: Component와 동일한 인터페이스를 구현하며, 내부에 다른 Component를 감싸고 추가적인 기능을 제공하는 클래스
  • ConcreteDecorator: Decorator를 상속받아 실제 기능을 추가하거나 수정하는 클래스

유니티에서 활용해보자

using UnityEngine;

public abstract class Character
{
    public abstract void Attack();
}

 

컴포넌트 캐릭터 클래스

 

public class Warrior : Character
{
    public override void Attack()
    {
        Debug.Log("전사의 공격");
    }
}

 

ConcreteComponent 워리어 클래스

 

public abstract class SkillDecorator : Character
{
    protected Character decoratedCharacter;

    public SkillDecorator(Character character)
    {
        decoratedCharacter = character;
    }

    public override void Attack()
    {
        decoratedCharacter.Attack();
    }
}

 

데코레이터 스킬데코레이터 클래스

 

public class FireballSkillDecorator : SkillDecorator
{
    public FireballSkillDecorator(Character character) : base(character)
    {
    }

    public override void Attack()
    {
        base.Attack();
        Debug.Log(" + 불덩이 스킬 발동");
    }
}
public class IceShieldSkillDecorator : SkillDecorator
{
    public IceShieldSkillDecorator(Character character) : base(character)
    {
    }

    public override void Attack()
    {
        base.Attack();
        Debug.Log(" + 얼음 방패 스킬 발동");
    }
}

 

ConcreteDecorator 파이어볼, 아이스쉴드 데코레이터 클래스

 

public class DecoratorPatternExample : MonoBehaviour
{
    void Start()
    {
        // 기본 캐릭터 생성
        Character warrior = new Warrior();

        // 스킬 추가 (데코레이터 패턴)
        warrior = new FireballSkillDecorator(warrior);
        warrior = new IceShieldSkillDecorator(warrior);

        // 공격 시뮬레이션
        warrior.Attack();
    }
}

 

기본 워리어에 파이어볼과 아이스 쉴드를 추가하여 공격

 

스킬이 추가된 것을 확인할 수 있다.

 


Warrior 캐릭터에 FireballSkillDecorator와 IceShieldSkillDecorator를 순차적으로 추가하여, 공격 시 두 스킬이 모두 발동되는 것을 확인할 수 있다. 이와 같이 데코레이터 패턴을 사용하면 기본 객체를 수정하지 않고도 여러 스킬을 유연하게 추가하고 관리할 수 있다는 장점이 있다.

'개인 공부 > 디자인패턴' 카테고리의 다른 글

디자인패턴 플라이웨이트 (경량패턴)  (0) 2024.07.15
디자인패턴 퍼사드  (0) 2024.07.15
디자인패턴 브릿지  (0) 2024.07.15
디자인패턴 싱글톤  (0) 2024.07.12
디자인패턴 프로토타입  (0) 2024.07.12