Menu
CoddyTech

Pola Strategy

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 93 dari 110.

Pola Strategy memungkinkan kamu mendefinisikan keluarga algoritma, mengenkapsulasi setiap algoritma dalam class tersendiri, dan membuatnya dapat saling dipertukarkan saat program berjalan. Alih-alih menetapkan perilaku secara langsung di dalam class, kamu menyuntikkan perilaku melalui interface, sehingga kamu dapat mengganti strategi tanpa memodifikasi class yang menggunakannya.

Pertimbangkan sistem pembayaran yang ingin mendukung berbagai metode pembayaran. Daripada menggunakan percabangan untuk menangani setiap metode, kamu mendefinisikan interface strategi dan membuat implementasi konkret:

abstract class PaymentStrategy {
  void pay(double amount);
}

class CreditCardPayment implements PaymentStrategy {
  @override
  void pay(double amount) => print('Paid \$$amount with Credit Card');
}

class PayPalPayment implements PaymentStrategy {
  @override
  void pay(double amount) => print('Paid \$$amount with PayPal');
}

class ShoppingCart {
  PaymentStrategy _paymentStrategy;

  ShoppingCart(this._paymentStrategy);

  void setPaymentStrategy(PaymentStrategy strategy) {
    _paymentStrategy = strategy;
  }

  void checkout(double total) {
    _paymentStrategy.pay(total);
  }
}

void main() {
  var cart = ShoppingCart(CreditCardPayment());
  cart.checkout(99.99);  // Dibayar $99.99 dengan Kartu Kredit

  cart.setPaymentStrategy(PayPalPayment());
  cart.checkout(49.99);  // Dibayar $49.99 dengan PayPal
}

ShoppingCart tidak tahu atau peduli bagaimana pembayaran bekerja, karena tugas itu diserahkan kepada strategi yang sedang ditetapkan. Kamu bisa menambahkan cara pembayaran baru dengan membuat class strategi baru tanpa mengubah kode keranjang. Pola ini ideal saat kamu memiliki beberapa cara untuk melakukan suatu tindakan dan ingin memilih atau beralih di antaranya secara dinamis.

challenge icon

Tantangan

Mudah

Mari buat sistem pemformatan teks menggunakan pola Strategy! Kamu akan membuat sistem yang dapat menerapkan berbagai strategi pemformatan pada teks, sehingga pengguna bisa beralih format secara dinamis tanpa mengubah pemroses teks inti.

Kamu akan mengatur kodemu dalam dua file:

  • formatting_strategies.dart: Buat sistem strategimu di sini. Definisikan class abstrak FormattingStrategy dengan method String format(String text). Lalu implementasikan tiga strategi konkret:
    • UppercaseStrategy - mengubah teks menjadi huruf besar semua
    • LowercaseStrategy - mengubah teks menjadi huruf kecil semua
    • TitleCaseStrategy - membuat huruf pertama setiap kata menjadi huruf besar (pisahkan berdasarkan spasi, buat karakter pertama setiap kata menjadi huruf besar, dan sisanya menjadi huruf kecil)
    Buat juga class TextProcessor yang menyimpan FormattingStrategy. Class ini harus memiliki konstruktor yang menerima strategi awal, method setStrategy() untuk mengubah strategi saat program berjalan, dan method process(String text) yang menerapkan strategi saat ini dan mengembalikan hasil yang sudah diformat.
  • main.dart: Impor strategi pemformatanmu dan tunjukkan cara pola Strategy memungkinkan pergantian perilaku secara dinamis. Buat TextProcessor yang dimulai dengan UppercaseStrategy. Proses teks hello world lalu cetak hasilnya. Kemudian beralih ke LowercaseStrategy, proses HELLO WORLD, lalu cetak hasilnya. Terakhir, beralih ke TitleCaseStrategy, proses the quick brown fox, lalu cetak hasilnya.

Ini menunjukkan kekuatan pola Strategy. TextProcessor tidak perlu mengetahui detail cara kerja pemformatan. Class ini cukup mendelegasikan tugas ke strategi yang sedang digunakan, sehingga kamu bisa menambahkan opsi pemformatan baru dengan mudah tanpa mengubah pemrosesnya!

Output yang diharapkan:

HELLO WORLD
hello world
The Quick Brown Fox

Coba sendiri

import 'formatting_strategies.dart';

void main() {
  // TODO: Buat TextProcessor dengan UppercaseStrategy sebagai strategi awal
  
  // TODO: Proses teks 'hello world' dan cetak hasilnya
  
  // TODO: Ganti ke LowercaseStrategy
  
  // TODO: Proses 'HELLO WORLD' dan cetak hasilnya
  
  // TODO: Ganti ke TitleCaseStrategy
  
  // TODO: Proses 'the quick brown fox' dan cetak hasilnya
}
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