Java Tutorial/Design Pattern/Strategy Pattern
Action with the Strategy Pattern
<source lang="java">
public class MainClass {
public static void main(String[] args) { Jet jet = new Jet(); jet.setGoAlgorithm(new DriveEngine()); jet.go(); jet.setGoAlgorithm(new FlyFastEngine()); jet.go(); jet.setGoAlgorithm(new DriveEngine()); jet.go(); }
} abstract class Vehicle {
Engine goa = null; public Vehicle() { } void setGoAlgorithm(Engine goa) { this.goa = goa; } public void go() { this.goa.go(); }
} class Jet extends Vehicle {
public Jet() { }
} interface Engine {
public void go();
} class FlyingFastEngine implements Engine {
public void go() { System.out.println("Now I"m flying fast."); }
}
class DriveEngine implements Engine {
public void go() { System.out.println("Now I"m driving."); }
}
class FlyFastEngine implements Engine {
public void go() { System.out.println("Now I"m flying fast."); }
}</source>
Strategy: choosing the algorithm at run-time
<source lang="java">
interface Find {
double[] algorithm(double[] line);
} class FindMethodA implements Find {
public double[] algorithm(double[] line) { return new double[] { 1 }; }
} class FindMethodB implements Find {
public double[] algorithm(double[] line) { return new double[] { 2 }; }
} class FindMethodC implements Find {
public double[] algorithm(double[] line) { return new double[] { 3 }; }
} class FindMethodD implements Find {
public double[] algorithm(double[] line) { return new double[] { 4 }; }
} class MySolver {
private Find strategy; public MySolver(Find strat) { strategy = strat; } double[] get(double[] line) { return strategy.algorithm(line); } void changeAlgorithm(Find newAlgorithm) { strategy = newAlgorithm; }
} public class StrategyPattern {
public static void main(String args[]) { MySolver solver = new MySolver(new FindMethodA()); double[] line = { 1.0, 2.0, 1.0, 2.0, -1.0, 3.0, 4.0, 5.0, 4.0 }; solver.get(line); solver.changeAlgorithm(new FindMethodC()); solver.get(line); }
}</source>