Menu
CoddyTech

Pola Composite

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 61 dari 70.

Pola Composite adalah pola struktural yang memungkinkan kamu menyusun object menjadi struktur pohon dan memperlakukan object individual serta grup object secara seragam. Pola ini cocok untuk merepresentasikan hierarki bagian-keseluruhan saat kamu ingin menangani item tunggal dan kumpulan melalui antarmuka yang sama.

Pola ini memiliki tiga komponen utama: antarmuka komponen yang mendefinisikan operasi umum, class leaf yang mewakili object individual, dan class composite yang memuat child serta mengimplementasikan antarmuka yang sama:

public interface IFileSystemItem
{
    string Name { get; }
    int GetSize();
}

public class File : IFileSystemItem
{
    public string Name { get; }
    private int _size;
    
    public File(string name, int size)
    {
        Name = name;
        _size = size;
    }
    
    public int GetSize() => _size;
}

public class Folder : IFileSystemItem
{
    public string Name { get; }
    private List<IFileSystemItem> _items = new List<IFileSystemItem>();
    
    public Folder(string name) => Name = name;
    
    public void Add(IFileSystemItem item) => _items.Add(item);
    
    public int GetSize() => _items.Sum(item => item.GetSize());
}

Keunggulan pola ini adalah client tidak perlu tahu apakah mereka bekerja dengan satu file atau seluruh hierarki folder:

var root = new Folder("root");
root.Add(new File("doc.txt", 100));

var subFolder = new Folder("images");
subFolder.Add(new File("photo.jpg", 500));
subFolder.Add(new File("icon.png", 50));

root.Add(subFolder);

Console.WriteLine(root.GetSize());  // 650

Pola Composite ideal untuk sistem file, pohon komponen UI, bagan organisasi, atau struktur apa pun yang mengharuskan container dan isinya diperlakukan dengan cara yang sama. Pola ini menyederhanakan kode client dengan menghilangkan kebutuhan untuk membedakan elemen sederhana dan kompleks.

challenge icon

Tantangan

Mudah

Mari buat sistem bagan organisasi menggunakan pola Composite. Kamu akan membuat struktur tempat karyawan perorangan dan departemen (yang berisi karyawan atau departemen lain) dapat diperlakukan secara seragam, sehingga kamu bisa menghitung total biaya gaji pada tingkat mana pun dalam hierarki.

Kamu akan mengatur kodemu dalam tiga file:

  • OrgComponent.cs: Definisikan interface IOrgComponent di namespace Organization dengan dua anggota: property Name (string) dan method GetSalary() yang mengembalikan bilangan bulat. Interface ini mewakili kontrak umum yang akan diikuti oleh karyawan perorangan maupun departemen.
  • OrgClasses.cs: Buat dua class di namespace yang sama:
    • Employee - class daun yang mewakili seorang pekerja. Class ini menerima nama dan gaji di constructornya, lalu mengimplementasikan interface dengan mengembalikan gajinya sendiri.
    • Department - class komposit yang mewakili sebuah grup. Class ini menerima nama di constructornya dan menyimpan list item IOrgComponent. Sertakan method Add(IOrgComponent component) untuk menambahkan anggota. GetSalary() harus mengembalikan jumlah gaji semua anggotanya.
  • Program.cs: Buat struktur organisasi berdasarkan input dan hitung total gajinya. Kamu akan membuat departemen dan karyawan, menyusunnya secara bertingkat, serta menunjukkan cara pola Composite memungkinkan seluruh hierarki diperlakukan secara seragam.

Kamu akan menerima input berikut:

  • Jumlah komponen yang akan dibuat
  • Untuk setiap komponen: jenisnya (employee atau department), diikuti nama, dan untuk karyawan, gajinya. Untuk departemen, kamu juga akan menerima nama departemen induk (atau root jika merupakan departemen tingkat teratas)

Format input untuk setiap komponen:

employee
{name}
{salary}
{parent_department}

department
{name}
{parent_department}

Setelah membangun strukturnya, cetak total gaji departemen root dengan format {root_name} Total Salary: {amount}.

Contohnya, jika inputnya adalah:

5
department
Engineering
root
employee
Alice
5000
Engineering
employee
Bob
4500
Engineering
department
QA
Engineering
employee
Charlie
4000
QA

Outputnya harus seperti berikut:

Engineering Total Salary: 13500

Departemen Engineering berisi Alice (5000), Bob (4500), dan departemen QA. QA berisi Charlie (4000). Saat kamu memanggil GetSalary() pada Engineering, method tersebut menghitung total secara rekursif dari semua komponen bertingkat, menunjukkan cara pola Composite memungkinkanmu bekerja dengan struktur pohon yang kompleks melalui interface sederhana dan seragam!

Coba sendiri

using System;
using System.Collections.Generic;
using Organization;

class Program
{
    public static void Main(string[] args)
    {
        int n = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Buat dictionary untuk menyimpan departemen berdasarkan nama
        // Ini membantumu menemukan departemen induk saat menambahkan komponen
        Dictionary<string, Department> departments = new Dictionary<string, Department>();
        
        // TODO: Catat departemen utama
        Department root = null;
        
        for (int i = 0; i < n; i++)
        {
            string type = Console.ReadLine();
            
            if (type == "department")
            {
                string name = Console.ReadLine();
                string parent = Console.ReadLine();
                
                // TODO: Buat departemen
                // TODO: Tambahkan departemen ke dictionary departments
                // TODO: Jika parent adalah "root", departemen ini adalah departemen utama
                // TODO: Jika tidak, temukan departemen induk dan tambahkan departemen ini ke dalamnya
            }
            else if (type == "employee")
            {
                string name = Console.ReadLine();
                int salary = Convert.ToInt32(Console.ReadLine());
                string parent = Console.ReadLine();
                
                // TODO: Buat karyawan
                // TODO: Temukan departemen induk dan tambahkan karyawan ke dalamnya
            }
        }
        
        // TODO: Tampilkan total gaji departemen utama
        // Format: "{root_name} Total Salary: {amount}"
        Console.WriteLine($"{root.Name} Total Salary: {root.GetSalary()}");
    }
}
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 C# online