POO & Design Patterns

Le patron Composite

Le patron Composite

Le patron Composite permet de créer une structure arborescente où chaque élément implémente la même interface.

L'idée est de modéliser les données par une hiérarchie sealed dont certains éléments contiennent potentiellement plusieurs éléments de la hiéarchie.

Exemple : Système de fichiers

public sealed interface FileSystemItem {

    Path path();
    String name();

    record File(Path path, String name, String extension) 
        implements FileSystemItem { ... }
    record Directory(Path path, String name, List<FileSystemItem> content)
        implements FileSystemItem { ... }
}

Exemple: Figures (1/2)

On part d'une situation où l'on manipule trois types de figures : les lignes, les rectangles et les ellipses.

public sealed interface Shape {
    void draw(Graphics2D graphics2D);

    record Line(int x1, int y1, int x2, int y2) implements Shape {...};
    record Rectangle(int x1, int y1, int x2, int y2) implements Shape {...};
    record Ellipse(int x1, int y1, int x2, int y2) implements Shape {...};
}

On veut manipuler des figures complexes construites à partir des figures de bases ou d'autres figures complexes.

Exemple: Figures (2/2)

On implémente naturellement le pattern Composite.

public sealed interface Shape {
    void draw(Graphics2D graphics2D);

    record Line(int x1, int y1, int x2, int y2) implements Shape {...};
    record Rectangle(int x1, int y1, int x2, int y2) implements Shape {...};
    record Ellipse(int x1, int y1, int x2, int y2) implements Shape {...};

     record ComplexShape(List<Shape> shapes){
        public ComplexShape {
            shapes = List.copyOf(shapes);
        }

        @Override
        public void draw(Graphics2D graphics2D){
            for(var shape : shapes){
                shape.draw(graphics2D);
            }
        }
    }

}