Problem Statement:
We have a duck class using inheritance as below. We want to make duck fly. How?
Added fly() in superclass. All duck can use the fly() method.
Code reuse!
BUT!!!
Not all duck can fly.
PROBLEM!
What can we do?
Override??
But what happen when we add wooden decoy ducks?
How about if we use interface?
if we write like this, what will be happened?
1. X Inheritance - not all of the subclasses should have flying or quacking behavior
2. X interface - Implement of Flyable and Quackable solves the problem but it destroys code reuse
HOW?
Here come with our ...
First!
We need to separate the changes from the same
We create 2 interfaces.
FlyBehavior and QuackBehavior
With this design, other types of objects can reuse our fly and quack behavior.
We can add new behaviors without modifying existing classes.
Define MallarDuck ...
Main class ...
Output:
Quak
I'm flying
We can set the behavior dynamically...
by adding these method
Main class ...
Output:
Quak
I'm flying!!
I can't fly
I'm flying with a rocket
Overview picture...
defines a family of algorithms, encapsulates each one, and makes them interchangeable.
Strategy lets the algorithm vary independently from client that use it.
Strategy pattern using HAS-A relationship.
Each duck has a FlyBehavior and a QuackBehavior.
When we put 2 classes together, we are using composition.
Create system using composition gives us a lot more flexibility. It can let us change behavior at runtime.