데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브 클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
abstract class Component {
public abstract void methodA();
public abstract void methodB();
}
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();
}
}
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");
}
}
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();
}
}