WZORCE #10 – Kompozyt

Cześć.

Ostatnim razem opisywałem  zasadę działania wzorca Pyłek, teraz nadeszła pora na bardzo podobny wzorzec – Kompozyt (ang. Composite).
Postaram się zrozumiale wyjaśnić, o co w nim właściwie chodzi i w jaki sposób poprawnie go używać.

Przeznaczenie:

Celem tego wzorca jest składanie obiektów w taki sposób, aby użytkownik widział je jako jeden obiekt i mógł wywołać na nim odpowiednie metody.

Zastosowanie:

Przykładem użycia może być zarządzanie pracownikami w jakiejś firmie. Często zdarza się tak, że konieczne jest wykonanie działania na całej grupie pracowników – wtedy bardzo przydaje się Kompozyt. Aby odpowiednio to zaimplementować, należy stworzyć dwie klasy Employee oraz Composit (obie implementują interfejs Component).
Klasa Employee reprezentuje oczywiście pracownika (imię, nazwisko, zarobki).
W klasie Composit trzeba stworzyć listę pracowników oraz odpowiednio zaimplementować metody, aby raz wywołane operowały na całej liście pracowników.

Implementacja:

Interfejs Component

public interface Component {
    default void add(Component component) {
    }

    default void remove(Component component) {
    }

    void show();

    void changeSalary(float percent);
}

Klasa reprezentująca pracownika

public class Employee implements Component {
    private String name;
    private String surname;
    private float salary;

    public Employee(String name, String surname, float salary) {
        this.name = name;
        this.surname = surname;
        this.salary = salary;
    }

    @Override
    public void show() {
        System.out.println("[Name: " + name + ", Surname: " + surname + ", salary: " + salary + "]");
    }

    @Override
    public void changeSalary(float percent) {
        salary = salary + (salary * percent / 100);
    }
}

Klasa Composite

public class Composite implements Component {

    List<Employee> employees = new ArrayList<>();

    @Override
    public void add(Component component) {
        employees.add((Employee) component);
    }

    @Override
    public void remove(Component component) {
        employees.remove(component);
    }

    @Override
    public void show() {
        for (Employee employee : employees) {
            employee.show();
        }
    }

    @Override
    public void changeSalary(float percent) {
        for (Employee employee : employees) {
            employee.changeSalary(percent);
        }
    }
}

Wywołanie programu:

Component employee1 = new Employee("John", "John",1000);
Component employee2 = new Employee("Jack", "Jack",1200);
Component employee3 = new Employee("Charlie", "Charlie",1300);
Component employee4 = new Employee("James", "James",1400);
Component employee5 = new Employee("Jacob", "Jacob",1500);

Component composite = new Composite();
composite.add(employee1);
composite.add(employee2);
composite.add(employee3);
composite.add(employee4);
composite.add(employee5);

composite.show();
composite.changeSalary(10);
composite.show();

Rezultat:

[Name: John, Surname: John, salary: 1000.0]
[Name: Jack, Surname: Jack, salary: 1200.0]
[Name: Charlie, Surname: Charlie, salary: 1300.0]
[Name: James, Surname: James, salary: 1400.0]
[Name: Jacob, Surname: Jacob, salary: 1500.0]
[Name: John, Surname: John, salary: 1100.0]
[Name: Jack, Surname: Jack, salary: 1320.0]
[Name: Charlie, Surname: Charlie, salary: 1430.0]
[Name: James, Surname: James, salary: 1540.0]
[Name: Jacob, Surname: Jacob, salary: 1650.0]

Diagram klas:

Dziękuje za uwagę.

Pozdrawiam.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *