Search

데커레이터 패턴

class
디자인 패턴
상태
완료
날짜

데커레이터 패턴

유명하진 않지만, 무기에 다양한 부착물이 붙어지는 배트 로얄 게임에서 강점을 보이는 패턴입니다.
(게임 개발자들에게는 꽤 유명한 패턴이지만, 다른 개발자들에게는 유명하지 않아, 많이들 모르시는 분이 많더군요.)
데커레이터 패턴은 기존 객체에 동적으로 새로운 책임이나 기능을 추가하는 패턴입니다.
데커레이터 패턴은 상속 대신 객체의 조합을 통해 기능을 확장할 수 있어 유연성을 높입니다.

데커레이터 패턴의 목적과 구조

데커레이터 패턴의 목적, 구조 :
목적 : 기존 객체에 동적으로 새로운 책임이나 기능을 추가하는 데 사용됩니다. 상속 대신 객체의 조합을 통해 기능을 확장할 수 있어 유연성을 높입니다.
구조 : 기본 인터페이스 및 추상 클래스를 정의하고, 구체적인 구현 클래스와 데커레이터 클래스를 작성합니다. 데커레이터 클래스는 기본 인터페이스를 참조하고 생성자를 통해 구체적인 구현 클래스를 주입받습니다.

데커레이터 패턴의 장,단점

데커레이터 패턴과 방문자 패턴은 장단점에서 유사합니다. 두 패턴 모두 기능을 캡슐화하여 동적으로 처리할 수 있습니다.
하지만 방문자 패턴은 기능을 방문했을 때의 처리에 중점을 두며 개발되었지만, 데커레이터 패턴은 추가 기능 획득에 중점을 둡니다. (물론, 해당 기능을 획득했을 때 방문자 패턴과 동일한 로직이 발동되도록 구현할 수도 있습니다.)
데커레이터 패턴의 장점 :
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#
복사
데커레이터 사용: 데커레이터를 사용하여 기능을 동적으로 추가할 수 있습니다.