Skip to content

Commit d884d06

Browse files
authored
Merge pull request mouredev#6900 from Hequebo/hequebo24
#24 - C#
2 parents fc3691f + e9dff0b commit d884d06

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
class Program
2+
{
3+
static void Main(string[] args)
4+
{
5+
// Componente original
6+
Console.WriteLine("---Componente original---");
7+
IComponent component = new ConcreteComponent();
8+
component.Operation();
9+
// Decorator
10+
Console.WriteLine("---Decorator---");
11+
Decorator decorator = new ConcreteDecorator();
12+
decorator.SetComponent(component);
13+
decorator.Operation();
14+
15+
// Ejercicio extra
16+
Console.WriteLine("---Ejercicio extra---");
17+
CountDecorator countDecorator = new ConcreteCountDecorator();
18+
countDecorator.SetComponent(component);
19+
countDecorator.Operation();
20+
countDecorator.Operation();
21+
countDecorator.Operation();
22+
countDecorator.Operation();
23+
countDecorator.Operation();
24+
25+
}
26+
}
27+
/*
28+
* El patrón Decorator es un patrón de
29+
* diseño que nos permite agregar
30+
* comportamiento a un objeto sin afectar
31+
* el comportamiento de otros objetos de
32+
* la misma clase.
33+
*/
34+
35+
/*
36+
* Definimos la interface base que define
37+
* la funcionalidad del objeto
38+
*/
39+
interface IComponent
40+
{
41+
public void Operation();
42+
}
43+
/*
44+
* Se crea el componente concreto, una
45+
* clase que implementa el metodo de
46+
* la interface
47+
*/
48+
class ConcreteComponent : IComponent
49+
{
50+
public void Operation() => Console.WriteLine("Ejecutando operación...");
51+
}
52+
/*
53+
* Se crea el decorador base, una clase
54+
* abstracta que implementa la interface
55+
* y permite agregar funcionalidad, no
56+
* es obligatorio crear el decorador base
57+
*/
58+
abstract class Decorator : IComponent
59+
{
60+
protected IComponent _component;
61+
62+
public void SetComponent(IComponent component) => _component = component;
63+
public virtual void Operation()
64+
{
65+
if (_component != null)
66+
_component.Operation();
67+
}
68+
}
69+
/*
70+
* Se crea el decorador concreto, hereda de
71+
* la clase abstracta Decorator y agrega la
72+
* funcionalidad extra al objeto
73+
*/
74+
class ConcreteDecorator : Decorator
75+
{
76+
public override void Operation()
77+
{
78+
base.Operation();
79+
Console.WriteLine("Se expande funcionalidad con Decorator...");
80+
}
81+
}
82+
abstract class CountDecorator : IComponent
83+
{
84+
protected IComponent _component;
85+
protected int count;
86+
public void SetComponent(IComponent component)
87+
{
88+
_component = component;
89+
count = 0;
90+
}
91+
public virtual void Operation()
92+
{
93+
if (_component != null)
94+
_component.Operation();
95+
}
96+
}
97+
class ConcreteCountDecorator : CountDecorator
98+
{
99+
public override void Operation()
100+
{
101+
base.Operation();
102+
count++;
103+
Console.WriteLine($"Se ha llamado a la función {count} veces");
104+
}
105+
}
106+

0 commit comments

Comments
 (0)