COMPOSITE PATTERN

Il Composite pattern viene utilizzato dove è necessario trattare un gruppo di oggetti in modo simile ad un singolo oggetto. Il pattern ha lo scopo di comporre gli oggetti con struttura ad albero, utile ad esempio per rappresentare una gerarchia. Questo tipo di design pattern rientra tra i pattern Strutturali. Il pattern utilizza una classe che contiene un gruppo di oggetti, la quale fornisce dei metodi per modificare il gruppo di oggetti.

composite

 

DIAGRAMMA UML COMPOSITE

uml

IMPLEMENTAZIONE COMPOSITE

Il pattern si compone di una classe Impiegato che espone i metodi per creare una gerarchia.

Step 1: Creiamo una classe Impiegato che avrà una Lista di Impiegati

import java.util.ArrayList;
import java.util.List;

public class Impiegato {
    private String nome;
    private String dipartimento;
    private int salario;
    private List subordinati;
    private static final String toLogPrefix = "[IMPIEGATO]: ";
    private String toLogMethod;
    private String toLog;
    Utility utility = new Utility();

    public Impiegato(String nome,String dipartimento, int salario) {
        this.nome = nome;
        this.dipartimento = dipartimento;
        this.salario = salario;
        subordinati = new ArrayList();
    }

    public void aggiungiSubordinato(Impiegato impiegato) {
        subordinati.add(impiegato);
        toLogMethod = "aggiungiSubordinato()::";
        toLog = "Subordinato inserito con successo!";
        utility.log(toLogPrefix, toLogMethod, toLog);
    }

    public void rimuoviSubordinato(Impiegato impiegato) {
        subordinati.remove(impiegato);
        toLogMethod = "rimuoviSubordinato()::";
        toLog = "Subordinato rimosso con successo!";
        utility.log(toLogPrefix, toLogMethod, toLog);
    }

    public List getSubordinati(){
        return subordinati;
    }

    public String toString(){
        return ("[IMPIEGATO] :[ Nome : " + nome + ", dipartimento : " + dipartimento + ", salario :" + salario+" ]");
    }
}

Step 2: Utilizziamo la classe impiegato e la classe Utility per creare una gerarchia

Main.java

public class Main {
    public static void main(String[] args) {
        Utility utility = new Utility();
        Impiegato CEO = new Impiegato("Gennaro","CEO", 50000);
        Impiegato responsabileVendite = new Impiegato("Roberto","Responsabile Vendite", 35000);
        Impiegato responsabileMarketing = new Impiegato("Michele","Responsabile Marketing", 35000);
        Impiegato impMark1 = new Impiegato("Laura","Marketing", 24000);
        Impiegato impMark2 = new Impiegato("Bob","Marketing", 24000);
        Impiegato impVen1 = new Impiegato("Riccardo","Vendite", 24000);
        Impiegato impVen2 = new Impiegato("Annalisa","Vendite", 24000);

        utility.componiAzienda(CEO, responsabileVendite, responsabileMarketing, impVen1, impVen2, impMark1, impMark2);
        utility.stampaAzienda(CEO);
    }
}

Utility.java

public class Utility {
    private static final String toLogPrefix = "[UTILITY]: ";
    private String toLogMethod;
    private String toLog;

    public void componiAzienda(Impiegato CEO, Impiegato responsabileVendite, Impiegato responsabileMarketing,
                               Impiegato impVen1, Impiegato impVen2, Impiegato impMark1, Impiegato impMark2) {
        CEO.aggiungiSubordinato(responsabileVendite);
        CEO.aggiungiSubordinato(responsabileMarketing);
        responsabileVendite.aggiungiSubordinato(impVen1);
        responsabileVendite.aggiungiSubordinato(impVen2);
        responsabileMarketing.aggiungiSubordinato(impMark1);
        responsabileMarketing.aggiungiSubordinato(impMark2);
        toLogMethod = "componiAzienda()::";
        toLog = "Azienda creata con successo!";
        log(toLogPrefix, toLogMethod, toLog);
    }
    public void stampaAzienda(Impiegato CEO) {
        toLogMethod = "stampaAzienda()::";
        toLog = "Riepilogo Azienda:";
        log(toLogPrefix, toLogMethod, toLog);
        System.out.println("\n"+CEO);
        for (Impiegato responsabili : CEO.getSubordinati()) {
            System.out.println(responsabili);
            for (Impiegato employee : responsabili.getSubordinati()) {
                System.out.println(employee);
            }
        }
    }

    public void log(String toLogPrefix, String toLogMethod, String toLog) {
        System.out.println(toLogPrefix + toLogMethod + toLog);
    }
}

Step 3: Output

[IMPIEGATO]: aggiungiSubordinato()::Subordinato inserito con successo!
[IMPIEGATO]: aggiungiSubordinato()::Subordinato inserito con successo!
[IMPIEGATO]: aggiungiSubordinato()::Subordinato inserito con successo!
[IMPIEGATO]: aggiungiSubordinato()::Subordinato inserito con successo!
[IMPIEGATO]: aggiungiSubordinato()::Subordinato inserito con successo!
[IMPIEGATO]: aggiungiSubordinato()::Subordinato inserito con successo!
[UTILITY]: componiAzienda()::Azienda creata con successo!
[UTILITY]: stampaAzienda()::Riepilogo Azienda:

[IMPIEGATO] :[ Nome : Gennaro, dipartimento : CEO, salario :50000 ]
[IMPIEGATO] :[ Nome : Roberto, dipartimento : Responsabile Vendite, salario :35000 ]
[IMPIEGATO] :[ Nome : Riccardo, dipartimento : Vendite, salario :24000 ]
[IMPIEGATO] :[ Nome : Annalisa, dipartimento : Vendite, salario :24000 ]
[IMPIEGATO] :[ Nome : Michele, dipartimento : Responsabile Marketing, salario :35000 ]
[IMPIEGATO] :[ Nome : Laura, dipartimento : Marketing, salario :24000 ]
[IMPIEGATO] :[ Nome : Bob, dipartimento : Marketing, salario :24000 ]

 

LINK UTILI