Strategy Pattern

Strategy Pattern

A Strategy Pattern says that "defines a family of functionality, encapsulate each one, and make them interchangeable". That is, in Strategy pattern, a class behaviour or its algorithm can be changed at run time.
The Strategy Pattern is also known as Policy.

Benefits:

  • It provides a substitute to sub-classing.
  • It defines each behaviour within its own class, eliminating the need for conditional statements.
  • It makes it easier to extend and incorporate new behaviour without changing the application.

Usage:

  • When the multiple classes differ only in their behaviours.e.g. Servlet API.
  • It is used when you need different variations of an algorithm.

Strategy Pattern in (Core Java API's) or JSE 7 API's:

Strategy Pattern

Strategy Pattern in (Advance Java API's) or JEE 7 API's:

Strategy Pattern

f1

Comparing our design to the definition of strategy pattern encapsulated kick and jump behaviors are two families of algorithms. And these algorithms are interchangeable as evident in implementation.
Below is the Java implementation of the same.

// Java program to demonstrate implementation of
// Strategy Pattern
  
// Abstract as you must have a specific fighter
abstract class Fighter {
    KickBehavior kickBehavior;
    JumpBehavior jumpBehavior;
  
    public Fighter(KickBehavior kickBehavior, JumpBehavior jumpBehavior) {
        this.jumpBehavior = jumpBehavior;
        this.kickBehavior = kickBehavior;
    }
    public void punch() {
        System.out.println("Default Punch");
    }
    public void kick() {
        // delegate to kick behavior
        kickBehavior.kick();
    }
    public void jump() {
        // delegate to jump behavior
        jumpBehavior.jump();
    }
    public void roll() {
        System.out.println("Default Roll");
    }
    public void setKickBehavior(KickBehavior kickBehavior) {
        this.kickBehavior = kickBehavior;
    }
    public void setJumpBehavior(JumpBehavior jumpBehavior) {
        this.jumpBehavior = jumpBehavior;
    }
    public abstract void display();
}
  
// Encapsulated kick behaviors
interface KickBehavior {
    public void kick();
}
class LightningKick implements KickBehavior {
    public void kick() {
        System.out.println("Lightning Kick");
    }
}
class TornadoKick implements KickBehavior {
    public void kick() {
        System.out.println("Tornado Kick");
    }
}
  
// Encapsulated jump behaviors
interface JumpBehavior {
    public void jump();
}
class ShortJump implements JumpBehavior {
    public void jump() {
        System.out.println("Short Jump");
    }
}
class LongJump implements JumpBehavior {
    public void jump() {
        System.out.println("Long Jump");
    }
}
  
// Characters
class Ryu extends Fighter {
    public Ryu(KickBehavior kickBehavior, JumpBehavior jumpBehavior) {
        super(kickBehavior,jumpBehavior);
    }
    public void display() {
        System.out.println("Ryu");
    }
}
class Ken extends Fighter {
    public Ken(KickBehavior kickBehavior, JumpBehavior jumpBehavior) {
        super(kickBehavior,jumpBehavior);
    }
    public void display() {
        System.out.println("Ken");
    }
}
class ChunLi extends Fighter
{
    public ChunLi(KickBehavior kickBehavior, JumpBehavior jumpBehavior) {
        super(kickBehavior,jumpBehavior);
    }
    public void display() {
        System.out.println("ChunLi");
    }
}
  
// Driver class
class StreetFighter {
    public static void main(String args[]) {
        // let us make some behaviors first
        JumpBehavior shortJump = new ShortJump();
        JumpBehavior LongJump = new LongJump();
        KickBehavior tornadoKick = new TornadoKick();
  
        // Make a fighter with desired behaviors
        Fighter ken = new Ken(tornadoKick,shortJump);
        ken.display();
  
        // Test behaviors
        ken.punch();
        ken.kick();
        ken.jump();
  
        // Change behavior dynamically (algorithms are
        // interchangeable)
        ken.setJumpBehavior(LongJump);
        ken.jump();
    }
}
Output :
Ken
Default Punch
Tornado Kick
Short Jump
Long Jump
Reference: https://www.geeksforgeeks.org/strategy-pattern-set-2/

Comments

Popular posts from this blog

gsutil Vs Storage Transfer Service Vs Transfer Appliance

SQL basic interview question