안녕지구 #developer #bompapa

Strategy Pattern (전략 패턴)

|

Context

1. abstract class ‘Duck’

public abstract class Duck {
  // object composition
  FlyBehavior flyBehavior;
  QuackBehavior quackBehavior;
  public Duck() {}

  public abstract void display();

  // inheritance
  public void swim() {
    System.out.println("All ducks float, event decoys!");
  }

  // delegation
  public void performFly() {
    flyBehavior.fly();  
  }
  public void performQuack() {
    quackBehavior.quack();
  }

  // set behavior
  public void setFlyBehavior(FlyBehavior fb) {
    flyBehavior = fb;
  }

  public void setFlyBehavior(QuackBehavior qb) {
    quackBehavior = qb;
  }
}


Strategy

1. FlyBehavior

public interface FlyBehavior {
  public void fly();
}

public class FlyWithWings implements FlyBehavior {
  public void fly() {
    System.out.println("I'm flying!");
  }
}

public class FlyNoWay implements FlyBehavior {
  public void fly() {
    System.out.println("I can't fly!");
  }
}

public class FlyRocketPowered implements FlyBehavior {
  public void fly() {
    System.out.println("I'm flying with a rocket!");
  }
}

2. QuackBehavior

public interface QuackBehavior {
  public void fly();
}

public class Quack implements QuackBehavior {
  public void quack() {
    System.out.println("Quack");
  }
}

public class MuteQuack implements QuackBehavior {
  public void quack() {
    System.out.println("<< slience >>");
  }
}

public class Squeak implements QuackBehavior {
  public void quack() {
    System.out.println("Squeak");
  }
}

Sample

1. MallardDuck

필요한 Strategy를 직접 생성해서 사용한다.

public class MallardDuck extends Duck {
  public MallarDuck() {
    quackBehavior = new Quack();
    flyBehavior = new FlyWithWings();
  }
  public void display() {
    System.out.println("I'm a real Mallard Duck");
  }
}

2. ModelDuck

필요한 Strategy를 Dynamic 하게 설정한다.

public class ModelDuck extends Duck {
  public ModelDuck() {
    quackBehavior = new Quack();
    flyBehavior = new FlyNoWay();
  }
  public void display() {
    System.out.println("I'm a model Duck");
  }
}

3. 실행

public class MiniDuckSimulator {
  public static void main(String[] args) {
    Duck mallard = new MallardDuck();
    mallard.performQuack(); // Quack
    mallard.performFly(); // I'm flying!

    Duck model = new ModelDuck();
    model.performQuack(); // Quack
    model.performFly(); // I can't fly
    model.setFlyBehavior(new FlyRocketPowered());
    model.performFly(); // I'm flying with a rocket!
  }
}

Comments