[c#] 데코레이터를 사용한 예제

데코레이터 디자인 패턴은 객체의 기능을 동적으로 확장하기 위해 사용됩니다. 데코레이터 패턴을 사용하면 기존 객체에 다양한 기능을 추가할 수 있으며, 객체를 수정하지 않고 새로운 기능을 입력할 수 있습니다.

예제 코드

using System;

// 컴포넌트 인터페이스
public interface IComponent
{
    string Operation();
}

// 기본 컴포넌트
public class ConcreteComponent : IComponent
{
    public string Operation()
    {
        return "ConcreteComponent";
    }
}

// 데코레이터
public class Decorator : IComponent
{
    private IComponent _component;

    public Decorator(IComponent component)
    {
        _component = component;
    }

    public virtual string Operation()
    {
        return _component.Operation();
    }
}

// 추가적인 기능을 가진 데코레이터
public class ConcreteDecoratorA : Decorator
{
    public ConcreteDecoratorA(IComponent component) : base(component)
    {
    }

    public override string Operation()
    {
        return $"ConcreteDecoratorA({base.Operation()})";
    }
}

// 더 많은 추가적인 기능을 가진 데코레이터
public class ConcreteDecoratorB : Decorator
{
    public ConcreteDecoratorB(IComponent component) : base(component)
    {
    }

    public override string Operation()
    {
        return $"ConcreteDecoratorB({base.Operation()})";
    }
}

// 클라이언트 코드
class Client
{
    public void ClientCode(IComponent component)
    {
        Console.WriteLine("RESULT: " + component.Operation());
    }
}

class Program
{
    static void Main()
    {
        // 기본 컴포넌트
        var simple = new ConcreteComponent();
        Console.WriteLine("Client: I get a simple component:");
        Client client = new Client();
        client.ClientCode(simple);

        // 데코레이터를 추가한 컴포넌트
        var decorator1 = new ConcreteDecoratorA(simple);
        var decorator2 = new ConcreteDecoratorB(decorator1);
        Console.WriteLine("Client: Now I've got a decorated component:");
        client.ClientCode(decorator2);
    }
}

위 예제 코드는 데코레이터 패턴을 사용하여 컴포넌트의 동적인 확장을 보여줍니다. 처음에는 기본 컴포넌트를 생성하고, 나중에 데코레이터를 추가하여 새로운 기능을 동적으로 확장하는 방법을 보여줍니다.

참고문헌: