Menu
CoddyTech

Pola Template Method

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

Pola Template Method adalah pola perilaku yang menentukan kerangka algoritma dalam base class, sehingga subclass dapat menimpa langkah-langkah tertentu tanpa mengubah struktur keseluruhan. Base class mengendalikan alur kerja, sementara class turunan menyesuaikan bagian-bagian tertentu.

Pola ini menggunakan pewarisan dan method abstrak. class dasar berisi "template method" yang memanggil serangkaian langkah, beberapa di antaranya bersifat abstrak dan harus diimplementasikan oleh subclass:

public abstract class DataProcessor
{
    // Template method: menentukan struktur algoritma
    public void Process()
    {
        ReadData();
        ProcessData();
        SaveData();
    }
    
    protected abstract void ReadData();
    protected abstract void ProcessData();
    protected virtual void SaveData() => Console.WriteLine("Saving to default location");
}

public class CsvProcessor : DataProcessor
{
    protected override void ReadData() => Console.WriteLine("Reading CSV file");
    protected override void ProcessData() => Console.WriteLine("Parsing CSV data");
}

public class JsonProcessor : DataProcessor
{
    protected override void ReadData() => Console.WriteLine("Reading JSON file");
    protected override void ProcessData() => Console.WriteLine("Parsing JSON data");
    protected override void SaveData() => Console.WriteLine("Saving to cloud");
}

Setiap subclass menyediakan implementasinya sendiri, sementara base class menetapkan urutan operasi:

DataProcessor csv = new CsvProcessor();
csv.Process();
// Membaca file CSV
// Mengurai data CSV
// Menyimpan ke lokasi bawaan

DataProcessor json = new JsonProcessor();
json.Process();
// Membaca file JSON
// Mengurai data JSON
// Menyimpan ke cloud

Pola Template Method ideal digunakan saat beberapa class berbagi struktur algoritma yang sama, tetapi berbeda dalam langkah-langkah tertentu. Pola ini mendorong penggunaan ulang kode dengan menempatkan logika umum di base class, sekaligus memberi fleksibilitas melalui method yang dapat ditimpa.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pembuatan laporan menggunakan pola Template Method. Berbagai jenis laporan, seperti laporan penjualan dan laporan inventaris, memiliki struktur keseluruhan yang sama: semuanya perlu mengumpulkan data, memformatnya, lalu menghasilkan output, tetapi setiap jenis laporan menangani langkah-langkah ini dengan cara berbeda.

Kamu akan mengatur kodemu dalam tiga file:

  • ReportGenerator.cs: Buat class abstrak ReportGenerator dalam namespace Reporting. Base class ini mendefinisikan kerangka algoritma pembuatan laporan melalui template method bernama Generate(). Method ini harus memanggil tiga langkah secara berurutan: GatherData(), FormatReport(), dan OutputReport(). Jadikan GatherData() dan FormatReport() abstrak, karena setiap jenis laporan akan mengimplementasikannya dengan cara berbeda, sedangkan OutputReport() harus berupa method virtual dengan implementasi default yang mencetak Sending to default printer.
  • ConcreteReports.cs: Buat dua class laporan konkret dalam namespace yang sama, yang mewarisi ReportGenerator:
    • SalesReport mengimplementasikan GatherData() untuk mencetak Collecting sales data from database dan FormatReport() untuk mencetak Formatting as sales summary
    • InventoryReport mengimplementasikan GatherData() untuk mencetak Scanning warehouse inventory, FormatReport() untuk mencetak Formatting as inventory list, dan menimpa OutputReport() untuk mencetak Sending to warehouse manager
  • Program.cs: Satukan semuanya dengan membuat instance laporan dan membuat laporan tersebut. Template method memastikan setiap laporan mengikuti proses tiga langkah yang sama, tetapi perilaku spesifik setiap langkah berbeda bergantung pada jenis laporannya.

Kamu akan menerima satu input:

  • Jenis laporan: sales atau inventory

Buat generator laporan yang sesuai berdasarkan input, lalu panggil method Generate()-nya.

Misalnya, jika input-nya sales, output-nya adalah:

Collecting sales data from database
Formatting as sales summary
Sending to default printer

Jika input-nya inventory, output-nya adalah:

Scanning warehouse inventory
Formatting as inventory list
Sending to warehouse manager

Perhatikan bahwa kedua laporan mengikuti struktur algoritma yang persis sama, yaitu mengumpulkan, memformat, lalu menghasilkan output, tetapi implementasi setiap langkah disesuaikan. SalesReport menggunakan perilaku output default, sedangkan InventoryReport menimpanya. Ini menunjukkan bagaimana pola Template Method memungkinkan kamu mengatur langkah mana yang wajib ditimpa dan langkah mana yang dapat disesuaikan secara opsional!

Coba sendiri

using System;
using Reporting;

class Program
{
    public static void Main(string[] args)
    {
        string reportType = Console.ReadLine();
        
        // TODO: Buat pembuat laporan yang sesuai berdasarkan reportType
        // Jika reportType bernilai "sales", buat SalesReport
        // Jika reportType bernilai "inventory", buat InventoryReport
        // Lalu panggil method Generate() pada laporan tersebut
        
    }
}
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