Repository navigation
Expand file tree
/
Copy pathExpOpenClosed.java
More file actions
50 lines (44 loc) · 1.66 KB
/
Copy pathExpOpenClosed.java
File metadata and controls
50 lines (44 loc) · 1.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// MAL - Cada vez que añades una figura debes modificar esta clase.
// Viola OCP porque está cerrada a extensión pero abierta a modificación.
class AreaCalculatorBad {
public double calculate(Object shape) {
if (shape instanceof CircleBad c) {
return Math.PI * c.radius * c.radius;
} else if (shape instanceof SquareBad s) {
return s.side * s.side;
}
// si añades Triángulo, tienes que venir aquí a modificar
throw new IllegalArgumentException("Forma no soportada");
}
}
class CircleBad { double radius; CircleBad(double r) { this.radius = r; } }
class SquareBad { double side; SquareBad(double s) { this.side = s; } }
// BIEN - Para añadir una nueva figura, solo creas una nueva clase que implemente Shape.
// AreaCalculator no se toca nunca.
interface Shape {
double area();
}
class Circle implements Shape {
double radius;
Circle(double r) { this.radius = r; }
public double area() { return Math.PI * radius * radius; }
}
class Square implements Shape {
double side;
Square(double s) { this.side = s; }
public double area() { return side * side; }
}
// Nueva figura: no tocamos nada existente
class Triangle implements Shape {
double base, height;
Triangle(double b, double h) { this.base = b; this.height = h; }
public double area() { return (base * height) / 2; }
}
public class ExpOpenClosed {
public static void main(String[] args) {
Shape[] shapes = { new Circle(5), new Square(4), new Triangle(6, 3) };
for (Shape s : shapes) {
System.out.printf("%s - Area: %.2f%n", s.getClass().getSimpleName(), s.area());
}
}
}