Pola Composite
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 99 dari 110.
Pola Composite memungkinkan kamu memperlakukan object individual dan kelompok object secara seragam. Pola ini menyusun object menjadi struktur pohon, tempat elemen tunggal dan kumpulan elemen berbagi antarmuka yang sama. Pola ini cocok untuk merepresentasikan hierarki seperti sistem file, bagan organisasi, atau komponen UI.
Pola ini memiliki dua jenis peserta: node Leaf (object individual tanpa anak) dan node Composite (kontainer yang menampung komponen lain). Keduanya mengimplementasikan antarmuka Component yang sama:
abstract class FileSystemItem {
String get name;
int getSize();
void display([String indent = '']);
}
class File implements FileSystemItem {
@override
final String name;
final int size;
File(this.name, this.size);
@override
int getSize() => size;
@override
void display([String indent = '']) {
print('$indent- $name ($size KB)');
}
}
class Folder implements FileSystemItem {
@override
final String name;
final List<FileSystemItem> _children = [];
Folder(this.name);
void add(FileSystemItem item) => _children.add(item);
@override
int getSize() => _children.fold(0, (sum, item) => sum + item.getSize());
@override
void display([String indent = '']) {
print('$indent+ $name/');
for (var child in _children) {
child.display('$indent ');
}
}
}
void main() {
var docs = Folder('Documents');
docs.add(File('resume.pdf', 150));
docs.add(File('photo.jpg', 2400));
var projects = Folder('Projects');
projects.add(File('main.dart', 25));
docs.add(projects);
docs.display();
print('Total: ${docs.getSize()} KB');
}Class Folder dapat berisi object File dan object Folder lainnya. Saat kamu memanggil getSize() pada sebuah folder, class ini menghitung secara rekursif total ukuran semua isinya. Kode client tidak perlu mengetahui apakah kode tersebut bekerja dengan satu file atau seluruh hierarki folder, karena keduanya merespons method yang sama.
Tantangan
MudahMari buat sistem bagan organisasi menggunakan pola Composite! Kamu akan membuat struktur yang memungkinkan karyawan individu dan departemen (yang berisi karyawan dan departemen lain) diperlakukan secara seragam, cocok untuk merepresentasikan hierarki perusahaan.
Kamu akan mengatur kodemu dalam dua file:
organization.dart: File ini berisi antarmuka komponen serta class leaf dan composite. Buat abstract classOrganizationUnitdengan gettername, methodgetSalaryBudget()yang mengembalikanint, dan methoddisplay([String indent = ''])untuk menampilkan hierarki. Buat classEmployee(leaf) yang mengimplementasikanOrganizationUnit. Class ini harus memiliki nama dan gaji, dengangetSalaryBudget()yang mengembalikan gaji karyawan. Methoddisplay()-nya harus mencetak[indent]- [name] ($[salary]). Lalu buat classDepartment(composite) yang juga mengimplementasikanOrganizationUnit. Class ini harus memiliki nama dan menyimpan list anak bertipeOrganizationUnit. Tambahkan methodadd()untuk memasukkan karyawan atau subdepartemen. MethodgetSalaryBudget()-nya harus menjumlahkan anggaran semua anak secara rekursif. Methoddisplay()-nya harus mencetak[indent]+ [name]/, lalu menampilkan setiap anak dengan indentasi yang ditambah dua spasi.main.dart: Impor file organisasi kamu dan buat struktur perusahaan. Buat departemenEngineeringyang berisi dua karyawan:Alicedengan gaji80000danBobdengan gaji75000. Buat departemenQAdengan satu karyawan:Caroldengan gaji65000. Sekarang buat departemenTechnology, lalu tambahkanEngineeringdanQAsebagai subdepartemen. Panggildisplay()pada departemen Technology, lalu cetakTotal Budget: $diikuti total anggaran gaji.
Keunggulan pola Composite adalah Technology.getSalaryBudget() secara otomatis menghitung total dari semua departemen dan karyawan yang bertingkat, jadi kode client tidak perlu mengetahui struktur internalnya!
Output yang diharapkan:
+ Technology/
+ Engineering/
- Alice ($80000)
- Bob ($75000)
+ QA/
- Carol ($65000)
Total Budget: $220000Coba sendiri
import 'organization.dart';
void main() {
// TODO: Buat departemen Engineering
// TODO: Tambahkan Alice dengan gaji 80000
// TODO: Tambahkan Bob dengan gaji 75000
// TODO: Buat departemen QA
// TODO: Tambahkan Carol dengan gaji 65000
// TODO: Buat departemen Technology
// TODO: Tambahkan Engineering dan QA sebagai subdepartemen
// TODO: Panggil display() pada departemen Technology
// TODO: Cetak "Total Budget: $" diikuti total anggaran gaji
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses Pembayaran12OOP Asinkron
Futures & async/awaitDasar-Dasar StreamPengontrol StreamKonstruktor AsinkronAsync dalam Method ClassRangkuman: Pengambil Data15Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola RepositoryLatihan sendiri: Compiler Dart online