데커레이터 패턴
유명하진 않지만, 무기에 다양한 부착물이 붙어지는 배트 로얄 게임에서 강점을 보이는 패턴입니다.
(게임 개발자들에게는 꽤 유명한 패턴이지만, 다른 개발자들에게는 유명하지 않아, 많이들 모르시는 분이 많더군요.)
데커레이터 패턴은 기존 객체에 동적으로 새로운 책임이나 기능을 추가하는 패턴입니다.
데커레이터 패턴은 상속 대신 객체의 조합을 통해 기능을 확장할 수 있어 유연성을 높입니다.
데커레이터 패턴의 목적과 구조
데커레이터 패턴의 목적, 구조 :
•
목적 : 기존 객체에 동적으로 새로운 책임이나 기능을 추가하는 데 사용됩니다. 상속 대신 객체의 조합을 통해 기능을 확장할 수 있어 유연성을 높입니다.
•
구조 : 기본 인터페이스 및 추상 클래스를 정의하고, 구체적인 구현 클래스와 데커레이터 클래스를 작성합니다. 데커레이터 클래스는 기본 인터페이스를 참조하고 생성자를 통해 구체적인 구현 클래스를 주입받습니다.
데커레이터 패턴의 장,단점
데커레이터 패턴과 방문자 패턴은 장단점에서 유사합니다. 두 패턴 모두 기능을 캡슐화하여 동적으로 처리할 수 있습니다.
하지만 방문자 패턴은 기능을 방문했을 때의 처리에 중점을 두며 개발되었지만, 데커레이터 패턴은 추가 기능 획득에 중점을 둡니다. (물론, 해당 기능을 획득했을 때 방문자 패턴과 동일한 로직이 발동되도록 구현할 수도 있습니다.)
데커레이터 패턴의 장점 :
1.
기능을 동적으로 추가하고 제거할 수 있습니다.
2.
객체의 조합을 통해 기능 확장이 가능하므로 유연성이 높습니다.
3.
상속의 단점을 피하면서 코드의 재사용성을 향상시킵니다.
데커레이터 패턴의 단점 :
1.
데커레이터 클래스가 많아질 경우 코드의 복잡성이 증가합니다.
2.
데커레이터의 사용이 과도하게 많아지면 코드를 이해하고 디버깅하기 어려워집니다.
데커레이터 패턴 UML
아래는 데커레이터 패턴의 UML 입니다.
UML의 각 요소를 바로 설명하는 것 보단, 아래에서 구조를 직접 코드로 구현하면서 사용해보겠습니다.
데커레이터 패턴 구현
public abstract class Component
{
public abstract void Operation();
}
C#
복사
기본 인터페이스 또는 추상 클래스 정의: 공통 작업에 대한 인터페이스 또는 추상 클래스를 정의합니다.
위, UML에서 Component가 이에 해당합니다.
public class ConcreteComponent : Component
{
public override void Operation()
{
Debug.Log("Concrete Component");
}
}
C#
복사
구체적인 구현 클래스 생성: 기본 인터페이스 또는 추상 클래스를 상속받아 구체적인 구현 클래스를 작성합니다.
위, UML의 ConcreteComponent가 이에 해당합니다.
이 부분이 배틀 그라운드로 따지면, 무기를 사용하는 사람이 되겠네요.
public abstract class Decorator : Component
{
protected Component _component;
public Decorator(Component component)
{
_component = component;
}
public override void Operation()
{
_component.Operation();
}
}
C#
복사
데커레이터 클래스 생성: 기본 인터페이스 또는 추상 클래스를 상속받아 데커레이터 클래스를 작성합니다. 데커레이터 클래스는 기본 인터페이스를 참조하고, 생성자를 통해 구체적인 구현 클래스를 주입받습니다.
위, UML의 Decorator가 이에 해당합니다.
이 부분이 배틀 그라운드로 따지면, 무기가 됩니다.
public class ConcreteDecoratorA : Decorator
{
public ConcreteDecoratorA(Component component) : base(component)
{
}
public override void Operation()
{
base.Operation();
Debug.Log("Concrete Decorator A");
}
}
public class ConcreteDecoratorB : Decorator
{
public ConcreteDecoratorB(Component component) : base(component)
{
}
public override void Operation()
{
base.Operation();
Debug.Log("Concrete Decorator B");
}
}
C#
복사
구체적인 데커레이터 클래스 생성: 데커레이터 클래스를 상속받아 구체적인 데커레이터 클래스를 작성합니다. 이 클래스에서 새로운 기능이나 책임을 추가합니다.
이 부분이 배틀 그라운드로 따지면, 무기의 각 파츠입니다.
public class DecoratorPatternExample : MonoBehaviour
{
void Start()
{
Component concreteComponent = new ConcreteComponent();
Decorator decoratorA = new ConcreteDecoratorA(concreteComponent);
Decorator decoratorB = new ConcreteDecoratorB(decoratorA);
decoratorB.Operation();
}
}
C#
복사
데커레이터 사용: 데커레이터를 사용하여 기능을 동적으로 추가할 수 있습니다.