스트래티지 패턴(Strategy pattern) 에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.
스트래티지를 활용하면 알고리짐을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할수있다.
package org.acounta.strategy;
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackbehavior;
public Duck() {
}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack(){
quackbehavior.quack();
}
public void swim(){
System.out.println("모든 오리는 물에 뜸");
}
}
----------------------------------------------------------------
package org.acounta.strategy;
public interface FlyBehavior {
void fly();
}
----------------------------------------------------------------
package org.acounta.strategy;
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("i'm not flying");
}
}
----------------------------------------------------------------
package org.acounta.strategy;
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("i'm flying");
}
}
----------------------------------------------------------------
package org.acounta.strategy;
public class MallardDuck extends Duck {
public MallardDuck(){
quackbehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("i'm water duck");
}
}
----------------------------------------------------------------
package org.acounta.strategy;
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("닥쳐!");
}
}
----------------------------------------------------------------
package org.acounta.strategy;
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
----------------------------------------------------------------
package org.acounta.strategy;
public interface QuackBehavior {
void quack();
}
----------------------------------------------------------------
package org.acounta.strategy;
public class Squack implements QuackBehavior {
@Override
public void quack() {
System.out.println("삑");
}
}
----------------------------------------------------------------
package org.acounta.strategy;
public class AcountaTestMain{
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
mallard.swim();
}
}
i'm flying
Quack
모든 오리는 물에 뜸