[c#] C# 데코레이터 패턴의 활용 예시

데코레이터 패턴은 객체에 새로운 기능을 동적으로 추가하거나 확장할 수 있도록 하는 구조적 패턴입니다. 이 패턴을 사용하여 객체에 여러 개의 장식을 렌더링할 수 있으며, 코드를 수정하지 않고도 새로운 기능을 추가할 수 있습니다.

예시

가정해보겠습니다. 우리는 음료 주문 시스템을 개발하고 있습니다. 메뉴에는 커피와 차가 있습니다. 또한, 고객은 음료에 설탕, 우유 또는 시럽을 추가할 수 있습니다. 또한, 샷을 추가할 수도 있습니다.

우리는 이러한 동적 장식을 구현하기 위해 데코레이터 패턴을 사용할 것입니다.

우선, 우리는 IBeverage 인터페이스를 정의하고, 해당 인터페이스를 Beverage 클래스에 구현합니다. 이 클래스에는 CostDescription이라는 메서드가 있을 수 있습니다.

public interface IBeverage
{
    int Cost();
    string Description();
}

그런 다음, Beverage 클래스를 구현합니다. 이 클래스는 IBeverage 인터페이스를 구현하고 있으며, 음료의 기본 속성을 나타냅니다.

public class Coffee : IBeverage
{
    public int Cost()
    {
        return 5;
    }

    public string Description()
    {
        return "Coffee";
    }
}

이제, 우리는 데코레이터 클래스를 만들 것입니다. 데코레이터 클래스는 IBeverage 인터페이스를 구현하고, 래핑하려는 구성 요소를 받아들이는 생성자를 가지고 있습니다.

다음은 설탕을 추가하는 데코레이터 클래스의 예시입니다.

public class SugarDecorator : IBeverage
{
    private readonly IBeverage _beverage;

    public SugarDecorator(IBeverage beverage)
    {
        _beverage = beverage;
    }

    public int Cost()
    {
        return _beverage.Cost() + 1;
    }

    public string Description()
    {
        return _beverage.Description() + ", Sugar";
    }
}

이제, 우리는 이러한 데코레이터 클래스들을 조합하여 다양한 옵션을 가진 음료를 만들 수 있습니다.

결론

데코레이터 패턴은 객체의 기능을 유연하게 확장할 수 있는 강력한 도구입니다. 이 패턴을 사용하면 기존 코드를 건드리지 않고도 동적으로 새로운 기능을 추가하거나 수정할 수 있는 장점이 있습니다. C#에서 데코레이터 패턴을 사용하면 코드를 더 유연하고 확장 가능하게 만들 수 있습니다.

참고 자료