Skip to content

Commit 80500de

Browse files
authored
Merge pull request mouredev#6320 from martinbohorquez/java#24
#24 java
2 parents a57ad75 + 07dce66 commit 80500de

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
/*
2+
* #24 PATRONES DE DISEÑO: DECORADORES
3+
*
4+
* @author martinbohorquez
5+
*/
6+
public class martinbohorquez {
7+
public static void main(String[] args) {
8+
Component component = new ConcreteComponent();
9+
Component smsConcreteDecorated = new SmsDecorator(component);
10+
Component facebookConcreteDecorated = new FacebookDecorator(component);
11+
component.notification();
12+
smsConcreteDecorated.notification();
13+
facebookConcreteDecorated.notification();
14+
15+
/*
16+
* DIFICULTAD EXTRA
17+
*/
18+
ComponentExtra componente = new ConcreteComponentExtra();
19+
CountDecorator contadorDecorador = new CountDecorator(componente);
20+
21+
contadorDecorador.operation();
22+
contadorDecorador.operation();
23+
contadorDecorador.operation();
24+
25+
System.out.printf("Total de invocaciones: %s%n", contadorDecorador.getContador());
26+
}
27+
28+
//Interfaz base
29+
interface Component {
30+
void notification();
31+
}
32+
33+
//Componente concreto
34+
static class ConcreteComponent implements Component {
35+
@Override
36+
public void notification() {
37+
System.out.println("Notificación por defecto!");
38+
}
39+
}
40+
41+
//Decorador abstracto
42+
abstract static class Decorator implements Component {
43+
private final Component component;
44+
45+
private Decorator(Component component) {
46+
this.component = component;
47+
}
48+
49+
public void notification() {
50+
this.component.notification();
51+
System.out.printf("Notificación por %s!%n", this.getClass().getSimpleName());
52+
}
53+
}
54+
55+
//Decorador concreto que añade funcionalidad
56+
static class SmsDecorator extends Decorator {
57+
private SmsDecorator(Component component) {
58+
super(component);
59+
}
60+
61+
@Override
62+
public void notification() {
63+
super.notification();
64+
addFunctionality();
65+
}
66+
67+
private void addFunctionality() {
68+
System.out.printf("Funcionalidad adicional de %s!%n", this.getClass().getSimpleName());
69+
}
70+
}
71+
72+
//Decorador concreto que añade funcionalidad
73+
static class FacebookDecorator extends Decorator {
74+
private FacebookDecorator(Component component) {
75+
super(component);
76+
}
77+
78+
@Override
79+
public void notification() {
80+
super.notification();
81+
addFunctionality();
82+
}
83+
84+
private void addFunctionality() {
85+
System.out.printf("Funcionalidad adicional de %s!%n", this.getClass().getSimpleName());
86+
}
87+
}
88+
89+
// DIFICULTAD EXTRA
90+
interface ComponentExtra {
91+
void operation();
92+
}
93+
94+
//Componente concreto
95+
static class ConcreteComponentExtra implements ComponentExtra {
96+
@Override
97+
public void operation() {
98+
System.out.println("Ejecutando operación base!");
99+
}
100+
}
101+
102+
//Decorador abstracto
103+
abstract static class DecoratorExtra implements ComponentExtra {
104+
private final ComponentExtra component;
105+
106+
private DecoratorExtra(ComponentExtra component) {
107+
this.component = component;
108+
}
109+
110+
public void operation() {
111+
this.component.operation();
112+
}
113+
}
114+
115+
// Decorador concreto que cuenta las veces que se llama a la operación
116+
static class CountDecorator extends DecoratorExtra {
117+
private int contador = 0;
118+
119+
private CountDecorator(ComponentExtra component) {
120+
super(component);
121+
}
122+
123+
@Override
124+
public void operation() {
125+
System.out.println("La operación se ha llamado " + ++contador + " vez/veces.");
126+
super.operation();
127+
}
128+
129+
private int getContador() {
130+
return contador;
131+
}
132+
}
133+
}
134+
135+
136+
137+

0 commit comments

Comments
 (0)