Ok, saya bohong. Postingan ini bukanlah akhir dari cerita kita. Kita akan bersenang-senang dulu. Setelah kita mempunyai behavior class dari FlyBehavior dan QuackBehavior, kenapa kita tidak memanfaatkannya untuk men-set behavior secara dinamik. Is that cool?!
Jadi, kita ingin men-set tipe behavior dari Duck lewat method setter, dan bukannya menginisialisasinya di constructor.
Ok, let’s start….
Kita buat kelas Duck seperti sebelumnya, tapi kali ini kita tambahkan dua method baru, yaitu setFlyBehavior dan setQuackBehavior. Ketika dipanggil, method ini akan men-set behavior.
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void swim() {
System.out.println("Saya berenang....");
}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
}
Terus, kita tambahkan tipe Duck baru, ModelDuck, dengan menuliskan kelas ModelDuck.java.
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public void display() {
System.out.println("Saya adalah Model Duck");
}
}
Mula-mula kita set ModelDuck, tidak dapat terbang.
Selanjutnya kita tambahkan satu tipe baru dari FlyBehavior, yaitu terbang dengan kekuatan roket. Kita tuliskan kelas FlyRocketPowered.java.
public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("Saya terbang dengan roket");
}
}
Langkah terakhir, kita ubah kelas tester MiniDuckSimulator.java dengan menambahkan ModelDuck dan membuat ModelDuck terbang dengan kekuatan roket. Ini dia kelas testernya.
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
System.out.println("----------------");
System.out.println("Model Duck");
Duck model = new ModelDuck();
model.performFly();
// Kita ubah supaya dapat terbang
// dengan roket
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
Kita compile, jalankan, dan outputnya ….

Yayay! Yang semula ModelDuck tidak dapat terbang, akhirnya dapat terbang dengan kekuatan roket setelah kita men-set FlyRocketPowered. Dengan cara ini, kita dapat mengubah behavior dari Duck saat runtime. Tinggal panggil saja method setter untuk behavior tersebut.
Ok, now what?
kita akan benar-benar wrap-up cerita ini di Strategy Pattern Bagian 5. Di sana juga akan muncul definisi Strategy Pattern. Gunakan definisi itu untuk mengesankan teman-teman. So trust me, and stay tuned….