Pola Strategy
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 69 dari 87.
Strategy Pattern adalah pola desain perilaku yang memungkinkan kamu mendefinisikan sekumpulan algoritma, mengenkapsulasi masing-masing dalam class tersendiri, dan membuatnya dapat saling dipertukarkan. Alih-alih mengodekan perilaku tertentu secara langsung, kamu dapat mengganti algoritma saat program berjalan tanpa mengubah kode yang menggunakannya.
Bayangkan sistem pembayaran yang mendukung beberapa metode pembayaran. Tanpa Strategy Pattern, logika percabanganmu akan menjadi berantakan. Dengan pola ini, setiap metode pembayaran menjadi strateginya sendiri:
interface PaymentStrategy {
void pay(int amount);
}
class CreditCardPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid " + amount + " via Credit Card");
}
}
class PayPalPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid " + amount + " via PayPal");
}
}class context menyimpan referensi ke sebuah strategi dan mendelegasikan pekerjaan kepadanya. Kuncinya, context tidak tahu strategi konkret mana yang sedang digunakannya. Context hanya mengetahui antarmukanya:
class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy strategy) {
this.paymentStrategy = strategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}Sekarang kamu bisa mengubah perilaku pembayaran secara dinamis:
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardPayment());
cart.checkout(100); // Dibayar 100 melalui Kartu Kredit
cart.setPaymentStrategy(new PayPalPayment());
cart.checkout(50); // Dibayar 50 melalui PayPalStrategy Pattern sangat berguna saat kamu memiliki beberapa cara untuk melakukan suatu tindakan dan ingin beralih di antaranya dengan mudah. Menambahkan cara pembayaran baru cukup dengan membuat class baru yang mengimplementasikan PaymentStrategy: tidak perlu mengubah kode yang sudah ada.
Tantangan
MudahMari buat sistem pemformatan teks menggunakan Strategy Pattern! Kamu akan membuat sistem yang memungkinkan strategi pemformatan berbeda ditukar saat program berjalan untuk mengubah teks dengan berbagai cara. Sistem ini cocok untuk aplikasi yang perlu mendukung beberapa format output.
Kamu akan menyusun kodemu dalam empat file:
TextFormatter.java: Definisikan interfaceTextFormatteryang akan diimplementasikan oleh semua strategi pemformatan. Interface ini harus mendeklarasikan satu methodString format(String text)yang menerima string dan mengembalikan versi yang sudah diformat.Formatters.java: Buat tiga strategi konkret yang mengimplementasikan interfaceTextFormattermilikmu:UpperCaseFormatter- mengubah teks menjadi huruf kapital semua.LowerCaseFormatter- mengubah teks menjadi huruf kecil semua.TitleCaseFormatter- mengubah huruf pertama setiap kata menjadi huruf kapital, sementara huruf lainnya menjadi huruf kecil. Kata-kata dipisahkan oleh spasi.TextEditor.java: Buat class konteks yang menggunakan strategi pemformatan.TextEditormilikmu harus memiliki:Field private untuk menyimpan strategi
TextFormatteryang sedang digunakan.Method
setFormatter(TextFormatter formatter)yang mengubah strategi pemformatan aktif.Method
publishText(String text)yang menerapkan formatter saat ini pada teks dan mencetakPublished: [formatted text]. Jika belum ada formatter yang ditetapkan, method ini harus mencetakPublished: [original text]tanpa mengubah teks.Main.java: Satukan sistem strategimu! Kamu akan menerima dua input: teks yang akan diformat (String) dan gaya pemformatan (String:"upper","lower", atau"title").Buat
TextEditor, lalu panggilpublishTextdengan teks input sebelum menetapkan formatter apa pun untuk menunjukkan perilaku default.Kemudian, berdasarkan input gaya, tetapkan strategi formatter yang sesuai dan panggil
publishTextlagi dengan teks yang sama untuk menampilkan hasil yang sudah diformat.
Kamu akan menerima dua input secara berurutan: teks yang akan diformat (String) dan gaya pemformatan (String).
Contohnya, dengan input hello world dan title, outputmu akan seperti ini:
Published: hello world
Published: Hello WorldPerhatikan bahwa TextEditor tidak mengetahui apa pun tentang logika pemformatan tertentu. Class ini hanya mendelegasikan tugas kepada strategi yang sedang ditetapkan. Dengan begitu, kamu bisa menambahkan gaya pemformatan baru dengan mudah tanpa mengubah kode editor!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
String style = scanner.nextLine();
// TODO: Buat instance TextEditor
// TODO: Panggil publishText dengan teks input (sebelum mengatur formatter)
// TODO: Berdasarkan input style ("upper", "lower", atau "title"),
// atur formatter yang sesuai dan panggil publishText lagi
}
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online