Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class OrganizationUnit dengan getter name, method getSalaryBudget() yang mengembalikan int, dan method display([String indent = '']) untuk menampilkan hierarki. Buat class Employee (leaf) yang mengimplementasikan OrganizationUnit. Class ini harus memiliki nama dan gaji, dengan getSalaryBudget() yang mengembalikan gaji karyawan. Method display()-nya harus mencetak [indent]- [name] ($[salary]). Lalu buat class Department (composite) yang juga mengimplementasikan OrganizationUnit. Class ini harus memiliki nama dan menyimpan list anak bertipe OrganizationUnit. Tambahkan method add() untuk memasukkan karyawan atau subdepartemen. Method getSalaryBudget()-nya harus menjumlahkan anggaran semua anak secara rekursif. Method display()-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 departemen Engineering yang berisi dua karyawan: Alice dengan gaji 80000 dan Bob dengan gaji 75000. Buat departemen QA dengan satu karyawan: Carol dengan gaji 65000. Sekarang buat departemen Technology, lalu tambahkan Engineering dan QA sebagai subdepartemen. Panggil display() pada departemen Technology, lalu cetak Total 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: $220000

Coba 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
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online