Skip to content

Commit 475ed62

Browse files
authored
Merge pull request mouredev#4398 from Jesusway69/main
#24 - Java
2 parents 371f789 + 4e0c972 commit 475ed62

File tree

1 file changed

+211
-0
lines changed

1 file changed

+211
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
package ejercicio24;
2+
3+
/*
4+
* EJERCICIO:
5+
* Explora el concepto de "decorador" y muestra cómo crearlo
6+
* con un ejemplo genérico.
7+
*/
8+
public class JesusWay69 {
9+
10+
public static void main(String[] args) {
11+
Developer frontend = new FrontEndDeveloper();
12+
frontend.skills();
13+
System.out.println("\n----------------------------------------------------------------------");
14+
15+
Developer backend = new BackEndDeveloper(new FrontEndDeveloper());
16+
backend.skills();
17+
System.out.println("\n----------------------------------------------------------------------");
18+
//Podemos instaciar metiendo todas las clases al constructor tal que así:
19+
Developer fullstack1 = new FullStackDeveloper(new BackEndDeveloper(new FrontEndDeveloper()));
20+
21+
//O podemos instanciar la última pasándole sólo la primera (la que implementaba el decorador),
22+
//al guardar con super el método anterior nos ejecutará todos los métodos sobreescritos de todas las clases que haya entre ellas
23+
Developer fullstack = new FullStackDeveloper(new FrontEndDeveloper());
24+
fullstack.skills();
25+
System.out.println(" |--------------| ");
26+
fullstack1.skills();
27+
System.out.println("\n----------------------------------------------------------------------");
28+
29+
Sum sum = new Counter(new MainSum());
30+
System.out.println(sum.sumtwo(5, 8));
31+
System.out.println(sum.sumtwo(7, 9));
32+
System.out.println(sum.sumtwo(3, 1));
33+
System.out.println(sum.sumtwo(6, 2));
34+
System.out.println(sum.sumtwo(0, 3));
35+
36+
}
37+
38+
}
39+
40+
interface Developer {//Declaramos una interfaz
41+
42+
void skills();// con el método principal que luego sobreescribiremos
43+
}
44+
45+
abstract class DevDecorator implements Developer {//Creamos una clase abstracta para implementar la interfaz
46+
47+
private final Developer developer;//Convertimos en constante y encapsulamos la interfaz para que no pueda tener subclases
48+
49+
public DevDecorator(Developer developer) {//Creamos el método decorador
50+
this.developer = developer;
51+
}
52+
53+
@Override
54+
public void skills() {//Sobreescribimos el método principal
55+
this.developer.skills();
56+
}
57+
}
58+
59+
class FrontEndDeveloper implements Developer {//Creamos una clase normal para implementar el decorador de la clase abstracta
60+
61+
@Override
62+
public void skills() {//Sobreescribimos el método principal para que empiece a añadir texto
63+
System.out.print(" El programador frontend tiene conocimientos en: ");
64+
this.addHTML();
65+
this.addCSS();
66+
}
67+
68+
private void addHTML() {//Creamos más métodos para añadir lenguajes dentro de esta clase frontend
69+
System.out.print(" HTML ");
70+
}
71+
72+
private void addCSS() {
73+
System.out.print("y CSS");
74+
}
75+
}
76+
77+
class BackEndDeveloper extends DevDecorator {//Creamos otra clase que hereda de la anterior
78+
79+
public BackEndDeveloper(Developer developer) {
80+
super(developer);//Creamos un método de clase propia cuyo argumento de clase Developer pasamos al método de lenguaje super
81+
}
82+
83+
@Override
84+
public void skills() {//Sobreescribimos de nuevo el método skills para añadir otro tipo de programador al texto
85+
super.skills();//Con super nos aseguramos que el texto del método antes de la sobreescritura se imprima también
86+
System.out.print("\n El programador backend conoce lenguajes como: ");
87+
this.addJava();
88+
this.addPython();
89+
this.addPhp();
90+
this.addTypescript();
91+
this.addJavascript();
92+
}
93+
94+
private void addTypescript() {
95+
System.out.print(", Typescript");
96+
}
97+
98+
private void addJavascript() {
99+
System.out.print(" o Javascript ");
100+
}
101+
102+
private void addJava() {
103+
System.out.print("Java");
104+
105+
}
106+
107+
private void addPhp() {
108+
System.out.print(", PhP");
109+
}
110+
111+
private void addPython() {
112+
System.out.print(", Python");
113+
}
114+
}
115+
116+
class FullStackDeveloper extends DevDecorator {//Seguimos añadiendo clases heredando del decorador
117+
118+
public FullStackDeveloper(Developer developer) {
119+
super(developer);//Si queremos que se ejecuten los métodos anteriores de impresión de texto debemos seguir
120+
// añadiendo el método de clase propia y añadirle a super nuestro argumento Developer
121+
}
122+
123+
@Override
124+
public void skills() {//Así podemos seguir añadiendo tantas clases como queramos
125+
super.skills();
126+
System.out.println("\n El programador senior añade a esos conocimientos los de frameworks como: ");
127+
this.addAngular();
128+
this.addReact();
129+
this.addTailwind();
130+
this.addSpring();
131+
this.addDjango();
132+
}
133+
134+
private void addAngular() {
135+
System.out.print(" Angular, ");
136+
}
137+
138+
private void addReact() {
139+
System.out.print("React, ");
140+
}
141+
142+
private void addTailwind() {
143+
System.out.print("Tailwind CSS, ");
144+
}
145+
146+
private void addSpring() {
147+
System.out.print("Spring/SpringBoot, ");
148+
}
149+
150+
private void addDjango() {
151+
System.out.println("o Django");
152+
}
153+
154+
}
155+
156+
/*
157+
* DIFICULTAD EXTRA (opcional):
158+
* Crea un decorador que sea capaz de contabilizar cuántas veces
159+
* se ha llamado a una función y aplícalo a una función de tu elección.
160+
*/
161+
162+
interface Sum {
163+
164+
String sumtwo(int a, int b);
165+
}
166+
167+
abstract class SumDecorator implements Sum {
168+
169+
private final Sum sum;
170+
171+
public SumDecorator(Sum sum) {
172+
this.sum = sum;
173+
}
174+
175+
@Override
176+
public String sumtwo(int a, int b) {
177+
178+
return this.sum.sumtwo(a, b);
179+
180+
}
181+
}
182+
183+
class MainSum implements Sum {
184+
185+
int result;
186+
187+
@Override
188+
public String sumtwo(int a, int b) {
189+
result = a + b;
190+
return Integer.toString(result);
191+
192+
}
193+
}
194+
195+
class Counter extends SumDecorator {
196+
197+
private static int calls = 0;
198+
199+
public Counter(Sum sum) {
200+
super(sum);
201+
}
202+
203+
@Override
204+
public String sumtwo(int a, int b) {
205+
super.sumtwo(a, b);
206+
++calls;
207+
return "Resultado de " + a + " + " + b + " = " + super.sumtwo(a, b) + " , llamada Nº: " + Integer.toString(calls);
208+
209+
210+
}
211+
}

0 commit comments

Comments
 (0)