Menu
CoddyTech

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 PayPal

Strategy 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.

challenge icon

Tantangan

Mudah

Mari 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 interface TextFormatter yang akan diimplementasikan oleh semua strategi pemformatan. Interface ini harus mendeklarasikan satu method String format(String text) yang menerima string dan mengembalikan versi yang sudah diformat.
  • Formatters.java: Buat tiga strategi konkret yang mengimplementasikan interface TextFormatter milikmu:

    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. TextEditor milikmu harus memiliki:

    Field private untuk menyimpan strategi TextFormatter yang sedang digunakan.

    Method setFormatter(TextFormatter formatter) yang mengubah strategi pemformatan aktif.

    Method publishText(String text) yang menerapkan formatter saat ini pada teks dan mencetak Published: [formatted text]. Jika belum ada formatter yang ditetapkan, method ini harus mencetak Published: [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 panggil publishText dengan teks input sebelum menetapkan formatter apa pun untuk menunjukkan perilaku default.

    Kemudian, berdasarkan input gaya, tetapkan strategi formatter yang sesuai dan panggil publishText lagi 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 World

Perhatikan 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
        
    }
}
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 Java online