Skip to content

Commit 6c51a0e

Browse files
authored
Merge pull request mouredev#4691 from ASJordi/main
#27 - Java
2 parents fba71cb + ecf648b commit 6c51a0e

File tree

1 file changed

+164
-0
lines changed

1 file changed

+164
-0
lines changed
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/*
2+
El Principio Abierto/Cerrado (OCP) establece que una clase debe estar abierta para extensión, pero cerrada para modificación.
3+
Modificación significa cambiar el código de una clase ya existente, mientras que extensión significa agregar nuevas funcionalidades.
4+
Por lo general, esto se realizará con interfaces y clases abstractas.
5+
*/
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
public class Main {
11+
12+
public static void main(String[] args) {
13+
Calculadora calculadora = new Calculadora();
14+
calculadora.agregarOperacion("suma", new Suma());
15+
calculadora.agregarOperacion("resta", new Resta());
16+
calculadora.agregarOperacion("multiplicacion", new Multiplicacion());
17+
calculadora.agregarOperacion("division", new Division());
18+
calculadora.agregarOperacion("potencia", new Potencia());
19+
20+
System.out.println(calculadora.ejecutarOperacion("suma", 5, 3));
21+
System.out.println(calculadora.ejecutarOperacion("resta", 5, 3));
22+
System.out.println(calculadora.ejecutarOperacion("multiplicacion", 5, 3));
23+
System.out.println(calculadora.ejecutarOperacion("division", 5, 3));
24+
System.out.println(calculadora.ejecutarOperacion("potencia", 5, 3));
25+
}
26+
27+
/*
28+
EJERCICIO:
29+
Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)"
30+
y crea un ejemplo simple donde se muestre su funcionamiento de forma correcta e incorrecta.
31+
*/
32+
static class Factura {
33+
// Atributos
34+
// Constructor
35+
// Métodos
36+
}
37+
38+
static class FacturaPersistencia {
39+
Factura factura;
40+
41+
public FacturaPersistencia(Factura factura) {
42+
this.factura = factura;
43+
}
44+
45+
public void guardarEnArchivo(String nombre) {
46+
// Guardar la factura en un archivo con el nombre especificado
47+
}
48+
49+
public void guardarEnBaseDeDatos() {
50+
// Guardar la factura en la base de datos
51+
}
52+
}
53+
54+
/*
55+
Aplicando el Principio Abierto/Cerrado (OCP) se puede crear una interfaz IFacturaPersistencia con un método guardar(Factura factura)
56+
y dos clases que implementen esta interfaz, una para guardar en la base de datos y otra para guardar en un archivo.
57+
De esta forma, si se quiere agregar una nueva forma de persistencia, se puede crear una nueva clase que implemente la interfaz
58+
sin tener que modificar las clases existentes.
59+
Incluso, crear una clase que administre diferentes formas de persistencia, como se muestra en el ejemplo.
60+
*/
61+
interface IFacturaPersistencia {
62+
void guardar(Factura factura);
63+
}
64+
65+
interface ILibroPersistencia {
66+
void guardar(Factura factura);
67+
}
68+
69+
static class BaseDeDatosPersistencia implements IFacturaPersistencia {
70+
@Override
71+
public void guardar(Factura factura) {
72+
// Guardar la factura en la base de datos
73+
}
74+
}
75+
76+
public class ArchivoPersistencia implements IFacturaPersistencia {
77+
@Override
78+
public void guardar(Factura factura) {
79+
// Guardar la factura en un archivo con el nombre especificado
80+
}
81+
}
82+
83+
static class AdministradorPersistencia {
84+
IFacturaPersistencia facturaPersistencia;
85+
ILibroPersistencia libroPersistencia;
86+
87+
public AdministradorPersistencia(IFacturaPersistencia facturaPersistencia, ILibroPersistencia libroPersistencia) {
88+
this.facturaPersistencia = facturaPersistencia;
89+
this.libroPersistencia = libroPersistencia;
90+
}
91+
}
92+
93+
/*
94+
DIFICULTAD EXTRA (opcional):
95+
Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
96+
Requisitos:
97+
- Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
98+
Instrucciones:
99+
1. Implementa las operaciones de suma, resta, multiplicación y división.
100+
2. Comprueba que el sistema funciona.
101+
3. Agrega una quinta operación para calcular potencias.
102+
4. Comprueba que se cumple el OCP.
103+
*/
104+
105+
interface IOperacion {
106+
double calcular(double a, double b);
107+
}
108+
109+
static class Suma implements IOperacion {
110+
@Override
111+
public double calcular(double a, double b) {
112+
return a + b;
113+
}
114+
}
115+
116+
static class Resta implements IOperacion {
117+
@Override
118+
public double calcular(double a, double b) {
119+
return a - b;
120+
}
121+
}
122+
123+
static class Multiplicacion implements IOperacion {
124+
@Override
125+
public double calcular(double a, double b) {
126+
return a * b;
127+
}
128+
}
129+
130+
static class Division implements IOperacion {
131+
@Override
132+
public double calcular(double a, double b) {
133+
if (b == 0) throw new IllegalArgumentException("No se puede dividir por cero");
134+
return a / b;
135+
}
136+
}
137+
138+
static class Potencia implements IOperacion {
139+
@Override
140+
public double calcular(double a, double b) {
141+
return Math.pow(a, b);
142+
}
143+
}
144+
145+
static class Calculadora {
146+
private Map<String, IOperacion> operaciones;
147+
148+
public Calculadora() {
149+
this.operaciones = new HashMap<>();
150+
}
151+
152+
public void agregarOperacion(String nombre, IOperacion operacion) {
153+
if (!this.operaciones.containsKey(nombre)) this.operaciones.put(nombre, operacion);
154+
else throw new IllegalArgumentException("La operación ya existe");
155+
}
156+
157+
public double ejecutarOperacion(String nombre, double a, double b) {
158+
IOperacion op = this.operaciones.get(nombre);
159+
if (op == null) throw new IllegalArgumentException("Operación no encontrada");
160+
return op.calcular(a, b);
161+
}
162+
}
163+
164+
}

0 commit comments

Comments
 (0)