Pola Composite
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 75 dari 87.
Composite Pattern adalah pola desain struktural yang memungkinkan kamu menyusun object menjadi struktur pohon untuk merepresentasikan hierarki keseluruhan dan bagian-bagiannya. Pola ini memungkinkan client menangani object individual dan susunan object secara seragam melalui antarmuka yang sama.
Bayangkan sistem file: sebuah folder dapat berisi file dan folder lain, yang dapat berisi lebih banyak file dan folder. Baik kamu menangani satu file maupun seluruh struktur folder, kamu ingin melakukan operasi seperti "dapatkan ukuran" dengan cara yang sama. Pola ini mendefinisikan antarmuka Component, object Leaf (elemen individual), dan object Composite (wadah yang menampung elemen anak):
interface FileComponent {
void display(String indent);
int getSize();
}
class File implements FileComponent {
private String name;
private int size;
public File(String name, int size) {
this.name = name;
this.size = size;
}
public void display(String indent) {
System.out.println(indent + name + " (" + size + "KB)");
}
public int getSize() {
return size;
}
}
class Folder implements FileComponent {
private String name;
private List<FileComponent> children = new ArrayList<>();
public Folder(String name) {
this.name = name;
}
public void add(FileComponent component) {
children.add(component);
}
public void display(String indent) {
System.out.println(indent + name + "/");
for (FileComponent child : children) {
child.display(indent + " ");
}
}
public int getSize() {
return children.stream().mapToInt(FileComponent::getSize).sum();
}
}Composite mendelegasikan operasi kepada child-nya, sehingga memungkinkan struktur rekursif. Client berinteraksi dengan tree tanpa mengetahui apakah mereka bekerja dengan leaf atau composite:
Folder root = new Folder("Documents");
root.add(new File("resume.pdf", 150));
Folder photos = new Folder("Photos");
photos.add(new File("vacation.jpg", 2000));
root.add(photos);
root.display("");
System.out.println("Total: " + root.getSize() + "KB");Composite Pattern ideal untuk merepresentasikan hierarki seperti bagan organisasi, komponen UI, atau sistem menu ketika kamu perlu memperlakukan kelompok dan individu secara sama.
Tantangan
MudahMari buat sistem bagan organisasi menggunakan Composite Pattern! Kamu akan membuat struktur tempat departemen dapat berisi karyawan dan subdepartemen lainnya, sehingga kamu bisa menghitung total gaji dan menampilkan hierarki dengan cara yang seragam, baik saat kamu melihat seorang karyawan maupun seluruh divisi.
Kamu akan menyusun kodemu dalam empat file:
OrganizationComponent.java: Definisikan antarmuka komponen yang akan diimplementasikan oleh karyawan dan departemen. Antarmuka ini harus mendeklarasikan dua method:showDetails(String indent)untuk menampilkan komponen dengan indentasi yang tepat, dangetSalary()yang mengembalikan total gaji sebagai bilangan bulat.Employee.java: Buat class daun yang merepresentasikan pekerja perorangan. SebuahEmployeememiliki nama (String) dan gaji (int), yang keduanya ditetapkan melalui constructor. SaatshowDetailsdipanggil, method ini harus mencetak[indent][name]: $[salary]. MethodgetSalarycukup mengembalikan gaji karyawan.Department.java: Buat class komposit yang dapat menampung karyawan dan subdepartemen. SebuahDepartmentmemiliki nama (String) dan menyimpan list anakOrganizationComponent. Class ini harus memiliki methodadd(OrganizationComponent component)untuk menambahkan anggota. SaatshowDetailsdipanggil, method ini mencetak[indent][name] Department, lalu memanggilshowDetailspada setiap anak dengan indentasi yang ditambah (tambahkan dua spasi). MethodgetSalarymengembalikan jumlah gaji semua anak.Main.java: Bangun organisasimu! Kamu akan menerima empat input: dua nama karyawan beserta gajinya, serta nama subdepartemen dengan satu karyawan.Buat departemen "Engineering" sebagai root. Tambahkan dua karyawan ke dalamnya menggunakan dua pasangan nama dan gaji pertama. Lalu buat subdepartemen menggunakan input ketiga, tambahkan satu karyawan ke dalamnya menggunakan pasangan nama dan gaji keempat, lalu tambahkan subdepartemen ini ke Engineering.
Panggil
showDetails("")pada departemen Engineering, lalu cetak total gaji dengan formatTotal Salary: $[amount].
Kamu akan menerima input dengan urutan berikut: nama employee1 (String), gaji employee1 (int), nama employee2 (String), gaji employee2 (int), nama subdepartemen (String), nama employee3 (String), gaji employee3 (int).
Misalnya, dengan input Alice, 75000, Bob, 65000, QA, Charlie, 55000, outputmu akan menjadi:
Engineering Department
Alice: $75000
Bob: $65000
QA Department
Charlie: $55000
Total Salary: $195000Perhatikan bahwa method showDetails dan getSalary yang sama bekerja dengan lancar, baik saat dipanggil pada seorang karyawan maupun pada seluruh departemen yang berisi subdepartemen bertingkat. Struktur komposit menangani rekursi secara otomatis, sehingga kamu dapat memperlakukan seluruh hierarki dengan cara yang seragam!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String emp1Name = scanner.nextLine();
int emp1Salary = Integer.parseInt(scanner.nextLine());
String emp2Name = scanner.nextLine();
int emp2Salary = Integer.parseInt(scanner.nextLine());
String subDeptName = scanner.nextLine();
String emp3Name = scanner.nextLine();
int emp3Salary = Integer.parseInt(scanner.nextLine());
// TODO: Buat departemen "Engineering" sebagai akar
// TODO: Buat dan tambahkan dua karyawan ke Engineering menggunakan data emp1 dan emp2
// TODO: Buat subdepartemen menggunakan subDeptName
// TODO: Buat dan tambahkan satu karyawan ke subdepartemen menggunakan data emp3
// TODO: Tambahkan subdepartemen ke Engineering
// TODO: Panggil showDetails("") pada departemen Engineering
// TODO: Cetak total gaji dengan format: Total Salary: $[amount]
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem Pembayaran9Generik
Pengantar GenerikClass GenerikMethod GenerikParameter Tipe BerbatasWildcard (?, extends, super)Ulasan: Wadah Generik12Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola IteratorLatihan sendiri: Compiler Java online