using System;
abstract class Component { public abstract void Operation(); }
class ConcreteComponent : Component
{
public override void Operation() => Console.WriteLine("ConcreteComponent.Operation()");
}
abstract class Decorator : Component
{
protected Component component;
public void SetComponent(Component c) => component = c;
public override void Operation() => component?.Operation();
}
class ConcreteDecoratorA : Decorator
{
private string addedState;
public override void Operation()
{
base.Operation();
addedState = "new state";
Console.WriteLine("ConcreteDecoratorA.Operation()");
}
}
class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine("ConcreteDecoratorB.Operation()");
}
void AddedBehavior() { }
}
public class Client
{
public static void Main()
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d1.SetComponent(c);
d2.SetComponent(d1); // 鏈式包裝
d2.Operation();
}
}
new Decorator1(
new Decorator2(
new Decorator3(
new ConcreteComponent()
)
)
)
每層建構子接收 Component 參數並保存,Operation() 內部呼叫 component.Operation(),形成「洋蔥式」包裹結構,故又稱包裝模式 (Wrapper Pattern)。