using System;using System.Runtime.Serialization;namespace ConsoleApp3
{classProgram{staticvoidMain(string[] args){Client client =newClient();var simple =newConcreteComponent();
Console.WriteLine("Client: I get a simple component:");
client.ClientCode(simple);
Console.WriteLine();// ...as well as decorated ones.//// Note how decorators can wrap not only simple components but the// other decorators as well.ConcreteDecoratorA decorator1 =newConcreteDecoratorA(simple);ConcreteDecoratorB decorator2 =newConcreteDecoratorB(decorator1);
Console.WriteLine("Client: Now I've got a decorated component:");
client.ClientCode(decorator2);}}publicabstractclassComponent{publicabstractstringOperation();}classConcreteComponent:Component{publicoverridestringOperation(){return"ConcreteComponent";}}abstractclassDecorator:Component{protectedComponent _component;publicDecorator(Component component){this._component = component;}publicvoidSetComponent(Component component){this._component = component;}publicoverridestringOperation(){if(this._component !=null)returnthis._component.Operation();elsereturnstring.Empty;}}classConcreteDecoratorA:Decorator{publicConcreteDecoratorA(Component comp):base(comp){}publicoverridestringOperation(){return $"ConcreteDecoratorA({base.Operation()})";}}classConcreteDecoratorB:Decorator{publicConcreteDecoratorB(Component comp):base(comp){}publicoverridestringOperation(){return $"ConcreteDecoratorB({base.Operation()})";}}publicclassClient{publicvoidClientCode(Component component){
Console.WriteLine("Result:"+ component.Operation());}}}