package serializer; import shape.Circle; import shape.Rectangle; import shape.Shape; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map; public class ShapeWriter implements ShapeVisitor { private PrintWriter printWriter; private static final Map<Class<? extends Shape>, ShapeSerializer<? extends Shape>> serializers = new HashMap<>(); static { serializers.put(Circle.class, new CircleSerializer()); serializers.put(Rectangle.class, new RectangleSerializer()); } public ShapeWriter(PrintWriter printWriter) { this.printWriter = printWriter; } public static void write (File file, Iterable<Shape> shapes) throws IOException { try(PrintWriter printWriter = new PrintWriter(file)){ ShapeWriter shapeWriter = new ShapeWriter(printWriter); for (Shape shape : shapes) { shape.accept(shapeWriter); } } } @Override public void visit(Circle circle) { ShapeSerializer<Circle> serializer = (ShapeSerializer<Circle>) serializers.get(Circle.class); if (serializer != null) { String serializedData = serializer.serialize(circle); printWriter.println(serializedData); } else { throw new IllegalArgumentException("No serializer found for Circle"); } } @Override public void visit(Rectangle rectangle) { ShapeSerializer<Rectangle> serializer = (ShapeSerializer<Rectangle>) serializers.get(Rectangle.class); if (serializer != null) { String serializedData = serializer.serialize(rectangle); printWriter.println(serializedData); } else { throw new IllegalArgumentException("No serializer found for Rectangle"); } } }