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.
Tantangan
MudahMari 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 abstrakFormattingStrategydengan methodString format(String text). Lalu implementasikan tiga strategi konkret:UppercaseStrategy- mengubah teks menjadi huruf besar semuaLowercaseStrategy- mengubah teks menjadi huruf kecil semuaTitleCaseStrategy- membuat huruf pertama setiap kata menjadi huruf besar (pisahkan berdasarkan spasi, buat karakter pertama setiap kata menjadi huruf besar, dan sisanya menjadi huruf kecil)
TextProcessoryang menyimpanFormattingStrategy. Class ini harus memiliki konstruktor yang menerima strategi awal, methodsetStrategy()untuk mengubah strategi saat program berjalan, dan methodprocess(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. BuatTextProcessoryang dimulai denganUppercaseStrategy. Proses tekshello worldlalu cetak hasilnya. Kemudian beralih keLowercaseStrategy, prosesHELLO WORLD, lalu cetak hasilnya. Terakhir, beralih keTitleCaseStrategy, prosesthe 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 FoxCoba 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses PembayaranLatihan sendiri: Compiler Dart online