데코레이터 패턴은 구조를 수정하지 않고도 객체에 새로운 책임을 동적으로 부여할 수 있는 구조적 디자인 패턴이다.
이 패턴은 같은 클래스의 다른 인스턴스에 영향을 주지 않고 객체에 기능을 추가해야 할 때 특히 유용하다.
주요 구성 요소
- 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 |