// All kinds of run behaviour are handled by RunBehaviour interface.
// This interface defines the signature of all run behaviours
// If we want to add new run behaviour, we just extend the RunBehaivour interface.
//
// Similarly, all kinds of kick behaviours are handled by KickBehaviour interface.
interface RunBehaviour{
String performRun();
}
interface KickBehaviour{
String performKick();
}
class RunLikeAmateur implements RunBehaviour{
public String performRun(){
return "runs like amateur";
}
}
class RunLikeMbappe implements RunBehaviour{
public String performRun(){
return "sprints like Mbappe";
}
}
class KickLikeAmateur implements KickBehaviour{
public String performKick(){
return "Kicks like amateur";
}
}
class KickLikeBeckham implements KickBehaviour{
public String performKick(){
return "bends like Beckham";
}
}
class Player{
private String name;
private RunBehaviour runBehaviour;
private KickBehaviour kickBehaviour;
Player(String name, RunBehaviour runBehaviour, KickBehaviour kickBehaviour){
this.name = name;
this.runBehaviour = runBehaviour;
this.kickBehaviour = kickBehaviour;
}
String performRun(){
return runBehaviour.performRun();
}
String performKick(){
return kickBehaviour.performKick();
}
public void setRunBehaviour(RunBehaviour runBehaviour){
this.runBehaviour = runBehaviour;
}
public void setKickBehaviour(KickBehaviour kickBehaviour) {
this.kickBehaviour = kickBehaviour;
}
public String getName(){
return this.name;
}
@Override
public String toString() {
return this.getName() + " " + this.performKick() + " and "
+ runBehaviour.performRun() + ".";
}
}
public class Strategy{
public static void main(String[] args){
Player p1 = new Player("Riyad", new RunLikeAmateur(), new KickLikeAmateur());
System.out.println(p1);
p1.setRunBehaviour(new RunLikeMbappe());
p1.setKickBehaviour(new KickLikeBeckham());
System.out.println(p1);
}
}