데코레이터 패턴 (Decorator Pattern)

One·2022년 6월 6일
1

Design Pattern

목록 보기
2/2
post-thumbnail

Decorator Pattern

데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브 클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.

Class Diagram

Code

  • 추상 클래스 Component를 정의한다.
    abstract class Component {
    	public abstract void methodA();
    	public abstract void methodB();
    }
  • Component를 상속받는 ConcreteComponent 클래스와 Decorator 클래스를 정의한다. Decorator 클래스에는 꾸며줄 Component를 할당해 줄 수 있도록 Set 함수를 작성한다.
    class ConcreteComponent : Component {
        public override void methodA() {
            Console.Write("Component Method A");
        }
    
        public override void methodB() {
            Console.Write("Component Method B");
        }
    }
    
    abstract class Decorator : Component {
        protected Component component;
    
        public void SetComponent(Component component) {
            this.component = component;
        }
    
        public override void methodA() {
            component.methodA();
        }
    
        public override void methodB() {
            component.methodB();
        }
    }
  • Decorator 클래스를 상속받는 ConcreteDecoratorA, ConcreteDecoratorB 클래스를 정의한다.
    class ConcreteDecoratorA : Decorator {
        public override void methodA() {
            base.methodA();
            Console.WriteLine(" decorated by Decorator A - Method A \n");
        }
    
        public override void methodB() {
            base.methodB();
            Console.WriteLine(" decorated by Decorator A - Method B \n");
        }
    }
    
    class ConcreteDecoratorB : Decorator {
        public override void methodA() {
            base.methodA();
            Console.WriteLine(" decorated by Decorator B - Method A \n");
        }
    
        public override void methodB() {
            base.methodB();
            Console.WriteLine(" decorated by Decorator B - Method B \n");
        }
    }
  • 메인 함수에서 Component 의 인스턴스를 생성하고 그 인스턴스를 ConcreteDecoratorA, ConcreteDecoratorB로 꾸며준다.
    class Program {
        static void Main(string[] args) {
            Component component = new ConcreteComponent();
            Decorator decoratorA = new ConcreteDecoratorA();
            Decorator decoratorB = new ConcreteDecoratorB();
    
            decoratorA.SetComponent(component);
            decoratorB.SetComponent(component);
    
            decoratorA.methodA();
            decoratorA.methodB();
    
            decoratorB.methodA();
            decoratorB.methodB();
        }
    }
  • 위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있다.
profile
Unity Developer

0개의 댓글