Add all 23 GoF design pattern implementations (2026-06-13)

This commit is contained in:
Ankur
2026-06-13 21:44:56 +05:30
commit a5beb61425
106 changed files with 2977 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
package visitor;
/**
* Concrete Visitor 1 — calculates area for each shape type.
* Area formulas live here, not scattered across shape classes.
*/
public class AreaCalculator implements ShapeVisitor {
@Override
public void visit(Circle c) {
double area = Math.PI * c.getRadius() * c.getRadius();
System.out.printf(" Area of %s = %.2f%n", c.getName(), area);
}
@Override
public void visit(Rectangle r) {
double area = r.getWidth() * r.getHeight();
System.out.printf(" Area of %s = %.2f%n", r.getName(), area);
}
@Override
public void visit(Triangle t) {
double area = 0.5 * t.getBase() * t.getHeight();
System.out.printf(" Area of %s = %.2f%n", t.getName(), area);
}
}

View File

@@ -0,0 +1,9 @@
package visitor;
public class Circle implements Shape {
private final double radius;
public Circle(double radius) { this.radius = radius; }
public double getRadius() { return radius; }
@Override public String getName() { return "Circle(r=" + radius + ")"; }
@Override public void accept(ShapeVisitor visitor) { visitor.visit(this); }
}

View File

@@ -0,0 +1,38 @@
package visitor;
import java.util.List;
/**
* Visitor Design Pattern — Runnable Demo
* Run: javac visitor/*.java -d out/visitor && java -cp out/visitor visitor.Main
* Article: https://ankurm.com/visitor-design-pattern-java/
*/
public class Main {
public static void main(String[] args) {
System.out.println("=== Visitor Design Pattern Demo ===\n");
List<Shape> shapes = List.of(
new Circle(5),
new Rectangle(4, 6),
new Triangle(3, 8)
);
System.out.println("-- Area Calculator Visitor --");
ShapeVisitor areaCalc = new AreaCalculator();
for (Shape shape : shapes) {
shape.accept(areaCalc);
}
System.out.println("\n-- Perimeter Calculator Visitor --");
ShapeVisitor perimCalc = new PerimeterCalculator();
for (Shape shape : shapes) {
shape.accept(perimCalc);
}
System.out.println("\n-- Key insight --");
System.out.println("Added PerimeterCalculator without touching Shape, Circle, Rectangle, Triangle.");
System.out.println("To add another operation: write one new Visitor class.");
System.out.println("\n=== Demo complete ===");
}
}

View File

@@ -0,0 +1,28 @@
package visitor;
/**
* Concrete Visitor 2 — calculates perimeter.
* Adding this visitor added zero code to Shape, Circle, Rectangle, Triangle.
*/
public class PerimeterCalculator implements ShapeVisitor {
@Override
public void visit(Circle c) {
double p = 2 * Math.PI * c.getRadius();
System.out.printf(" Perimeter of %s = %.2f%n", c.getName(), p);
}
@Override
public void visit(Rectangle r) {
double p = 2 * (r.getWidth() + r.getHeight());
System.out.printf(" Perimeter of %s = %.2f%n", r.getName(), p);
}
@Override
public void visit(Triangle t) {
// Simplified: assume isoceles — base + 2 equal sides approximated
double side = Math.sqrt(Math.pow(t.getBase() / 2, 2) + Math.pow(t.getHeight(), 2));
double p = t.getBase() + 2 * side;
System.out.printf(" Perimeter of %s = %.2f%n", t.getName(), p);
}
}

View File

@@ -0,0 +1,10 @@
package visitor;
public class Rectangle implements Shape {
private final double width, height;
public Rectangle(double width, double height) { this.width = width; this.height = height; }
public double getWidth() { return width; }
public double getHeight() { return height; }
@Override public String getName() { return "Rectangle(" + width + "x" + height + ")"; }
@Override public void accept(ShapeVisitor visitor) { visitor.visit(this); }
}

View File

@@ -0,0 +1,7 @@
package visitor;
/** Element interface — accepts a visitor */
public interface Shape {
void accept(ShapeVisitor visitor);
String getName();
}

View File

@@ -0,0 +1,8 @@
package visitor;
/** Visitor interface — one visit() method per concrete element type */
public interface ShapeVisitor {
void visit(Circle circle);
void visit(Rectangle rectangle);
void visit(Triangle triangle);
}

View File

@@ -0,0 +1,10 @@
package visitor;
public class Triangle implements Shape {
private final double base, height;
public Triangle(double base, double height) { this.base = base; this.height = height; }
public double getBase() { return base; }
public double getHeight() { return height; }
@Override public String getName() { return "Triangle(b=" + base + ",h=" + height + ")"; }
@Override public void accept(ShapeVisitor visitor) { visitor.visit(this); }
}