Menu
CoddyTech

Pola Strategy

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

Pola Strategy adalah pola perilaku yang memungkinkan kamu mendefinisikan sekumpulan algoritma, mengenkapsulasi setiap algoritma dalam class tersendiri, dan membuatnya dapat saling dipertukarkan saat program berjalan. Alih-alih menetapkan perilaku secara langsung di dalam kode, kamu memasukkan strategi yang diinginkan ke dalam sebuah object.

Pola ini terdiri dari tiga bagian: interface strategi yang mendefinisikan kontrak algoritma, class strategi konkret yang menerapkan perilaku berbeda, dan class konteks yang menggunakan strategi:

public interface IPaymentStrategy
{
    void Pay(decimal amount);
}

public class CreditCardPayment : IPaymentStrategy
{
    public void Pay(decimal amount) => 
        Console.WriteLine($"Paid {amount} via Credit Card");
}

public class PayPalPayment : IPaymentStrategy
{
    public void Pay(decimal amount) => 
        Console.WriteLine($"Paid {amount} via PayPal");
}

public class ShoppingCart
{
    private IPaymentStrategy _paymentStrategy;
    
    public void SetPaymentMethod(IPaymentStrategy strategy)
    {
        _paymentStrategy = strategy;
    }
    
    public void Checkout(decimal total)
    {
        _paymentStrategy.Pay(total);
    }
}

Konteks (ShoppingCart) tidak tahu metode pembayaran mana yang digunakannya, konteks hanya memanggil Pay() pada strategi apa pun yang diberikan:

var cart = new ShoppingCart();

cart.SetPaymentMethod(new CreditCardPayment());
cart.Checkout(99.99m);  // Berhasil membayar 99.99 dengan Kartu Kredit

cart.SetPaymentMethod(new PayPalPayment());
cart.Checkout(49.99m);  // Berhasil membayar 49.99 melalui PayPal

Pola Strategy menghilangkan logika percabangan yang kompleks. Menambahkan method pembayaran baru berarti membuat class baru yang mengimplementasikan IPaymentStrategy, tanpa perlu mengubah ShoppingCart. Ini membuat kodemu terbuka untuk perluasan, tetapi tertutup untuk modifikasi.

challenge icon

Tantangan

Mudah

Mari buat kalkulator biaya pengiriman menggunakan pola Strategy. Metode pengiriman yang berbeda memiliki algoritma penetapan harga yang berbeda, dan sistemmu harus memungkinkan pergantian di antara metode tersebut saat program berjalan tanpa mengubah logika inti pemrosesan pesanan.

Kamu akan membagi kodemu ke dalam tiga file:

  • ShippingStrategy.cs: Definisikan antarmuka IShippingStrategy di namespace Shipping dengan method CalculateCost(double weight) yang mengembalikan nilai double. Lalu buat tiga class strategi konkret:
    • StandardShipping - menghitung biaya sebagai weight * 1.5
    • ExpressShipping - menghitung biaya sebagai weight * 3.0 + 5.0 (termasuk biaya tetap untuk pengiriman ekspres)
    • OvernightShipping - menghitung biaya sebagai weight * 5.0 + 10.0 (layanan premium dengan biaya dasar yang lebih tinggi)
  • OrderProcessor.cs: Buat class OrderProcessor di namespace yang sama. Ini adalah class konteks yang menggunakan strategi pengiriman. Class ini harus memiliki:
    • Field privat untuk menyimpan IShippingStrategy yang sedang digunakan
    • Method SetShippingMethod(IShippingStrategy strategy) untuk mengganti strategi pengiriman
    • Method ProcessOrder(double weight) yang menggunakan strategi saat ini untuk menghitung dan mengembalikan biaya pengiriman
  • Program.cs: Satukan semuanya dengan membuat OrderProcessor dan menunjukkan cara mengganti strategi pengiriman saat program berjalan. Processor yang sama dapat menghitung biaya menggunakan algoritma yang berbeda hanya dengan mengganti strateginya.

Kamu akan menerima dua input:

  • Tipe metode pengiriman: standard, express, atau overnight
  • Berat paket sebagai angka desimal (misalnya, 4.5)

Buat OrderProcessor, tetapkan strategi pengiriman yang sesuai berdasarkan tipe input, lalu proses pesanan dan cetak biaya yang dihitung.

Misalnya, jika inputnya adalah express dan 4.5, outputnya seharusnya:

18.5

Ini menunjukkan keunggulan pola Strategy. OrderProcessor tidak memuat logika perhitungan biaya pengiriman. Class ini hanya mendelegasikan tugas ke strategi yang diberikan, sehingga kamu dapat dengan mudah menambahkan metode pengiriman baru (seperti DroneDelivery) tanpa mengubah processor sama sekali!

Coba sendiri

using System;
using Shipping;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input
        string shippingType = Console.ReadLine();
        double weight = Convert.ToDouble(Console.ReadLine());

        // TODO: Buat instance OrderProcessor

        // TODO: Berdasarkan shippingType ("standard", "express", atau "overnight"),
        // buat strategi pengiriman yang sesuai dan tetapkan pada processor

        // TODO: Proses pesanan dan cetak biaya yang dihitung
    }
}
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