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 PayPalPola 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.
Tantangan
MudahMari 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 antarmukaIShippingStrategydi namespaceShippingdengan methodCalculateCost(double weight)yang mengembalikan nilaidouble. Lalu buat tiga class strategi konkret:StandardShipping- menghitung biaya sebagaiweight * 1.5ExpressShipping- menghitung biaya sebagaiweight * 3.0 + 5.0(termasuk biaya tetap untuk pengiriman ekspres)OvernightShipping- menghitung biaya sebagaiweight * 5.0 + 10.0(layanan premium dengan biaya dasar yang lebih tinggi)
OrderProcessor.cs: Buat classOrderProcessordi namespace yang sama. Ini adalah class konteks yang menggunakan strategi pengiriman. Class ini harus memiliki:- Field privat untuk menyimpan
IShippingStrategyyang 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
- Field privat untuk menyimpan
Program.cs: Satukan semuanya dengan membuatOrderProcessordan 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, atauovernight - 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.5Ini 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list10Pola Desain Bagian 1
Pengantar Pola DesainSingleton yang Aman untuk ThreadPola FactoryPola Observer (Peristiwa)Pola Strategy2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online