Jeśli moja strona Ci pomogła, i chcesz aby była bardziej rozwijana, wesprzyj mnie
buy me a coffee
I. Wzorce kreacyjne
II. Wzorce strukturalne
III. Wzorce czynnościowe
|
Kompozyt (Composite) - wzorzec projektowy (design pattern) - java
1. Cel:
Kompozyt (Composite) reprezentuje hierarchię obiektów w formie drzewa.
Proszę nie mylić kompozyt (composite) z kompozycja (composition).
Kompozyt (Composite) jest wzorcem operującym na hierarchi obiektów.
kompozycja (Composition) jest to jeden obiekt zawieracjący drugi.
2. Problem:
Chcemy mieć powiązene ze sobą obiekty w formie drzewa. np Pracownik jak Manager, ma pod sobą innych pracowników,
ale sam również jest pracownikiem i jest pod dyrektorem.
3. Rozwiązanie:
Budujemy strukture drzewa, implementujemy interface komponentu, implementujemy na jego podstawie liście (dzieci, Leaf)
oraz composite (kompozyt) - który ma informację o liściach (dzieciach).
4. Diagram klas wzorca composite:

5. Implementacja:
Implementacja interfeju:
public interface Employee {
void add(Employee employee);
void remove(Employee employee);
Rmployee getChild(int i);
String getName();
double getSalary();
void printDetails();
}
Implementacja klasy Manager:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Manager implements Employee{
private String name;
private double salary;
private List<Employee> employees = new ArrayList <Employee>();
public Manager(String name,double salary){
this.name = name;
this.salary = salary;
}
public void add(Employee employee) {
employees.add(employee);
}
public void remove(Employee employee) {
employees.remove(employee);
}
public Employee getChild(int i) {
return employees.get(i);
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public void printDetails() {
System.out.println("---------------------");
System.out.println("Name: " + getName());
System.out.println("Salary: " + getSalary());
Iterator<Employee> employeeIterator = employees.iterator();
while(Employee employee : employees){
employee.print();
}
}
}
Implementacja klasy pracownika Developer:
public class Developer implements Employee {
private String name;
private double salary;
public Developer(String name,double salary){
this.name = name;
this.salary = salary;
}
public void add(Employee employee) {
throw new UnsupportedOperationException();
}
public void remove(Employee employee) {
throw new UnsupportedOperationException();
}
public Employee getChild(int i) {
return null;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public void printDetails() {
System.out.println("---------------------");
System.out.println("Name: " + getName());
System.out.println("Salary: " + getSalary());
}
}
Klasa testowa:
public class CompositeTest {
public static void main(String[] args) {
Employee employee1 = new Developer("Mateusz Nowak", 4242);
Employee employee2 = new Developer("Tomasz Kowalski", 7000);
Employee manager1 = new Manager("Michal Malinowski",6000);
manager1.add(employee1);
manager1.add(employee2);
Employee employee3 = new Developer("Jan Fasola", 2300);
Manager generalManager=new Manager("Chuck Norris", 29000);
generalManager.add(employee3);
generalManager.add(manager1);
generalManager.printDetails();
}
}
Wypisane zostanie:
---------------------
Name: Mateusz Nowak
Salary: 4242.0
---------------------
Name: =Tomasz Kowalski
Salary: 7000.0
---------------------
NameL Bernhard Riemann
Salary =1900.0
---------------------
Name: Carl Gauss
Salary: 6000.0
---------------------
Name: Chuck Norris
Salary: 29000.0
6. Zastosowanie w kodzie java:
- java.awt.Container#add(Component) (praktycznie wszystkie elementy Swinga)
- javax.faces.component.UIComponent#getChildren() (praktycznie we wszystkich komponentach JSF UI)
|