반응형
헤드 퍼스트 디자인 패턴(개정판)을 공부하며 정리하는 내용입니다.
전략패턴
- 디자인 원칙 중 첫번째 원칙은 "애플리케이션에서 변하는 부분을 찾고 변하지 않는 부분과 분리한다." 이다.
- 변하는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 캡슐화 하면 프로그램을 수정하거나 기능이 변경 될때도 기존의 코드를 건들이지 않고 변화에 유연하게 대처할 수 있다.
- 객체 내부에서 인터페이스를 이용하여 틀을 만들고, 구현체에게 실제 동작하는 방식을 입력받아 유연하게 동작하도록 하는 방식을 전략 패턴이라고 한다.
public abstract class Duck {
FlyBehavior flyBehavior;
Quackavior quackBehavior;
public void fly(){
flyBehavior.fly();
}
public void quack(){
quackBehavior.quack();
}
public void swim(){
System.out.println("오리는 모두 물에 뜬다.");
}
public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
public void setQuackavior(Quackavior quackBehavior){
this.quackBehavior = quackBehavior;
}
}
public class MallardDuck extends Duck{
public MallardDuck() {
flyBehavior = new MallardDuckFly();
quackBehavior = new MallardDuckQuack();
}
public void display(){
System.out.println("청동오리");
}
}
public class MallardDuckFly implements FlyBehavior{
@Override
public void fly() {
System.out.println("MallardDUckFly");
}
}
Duck 클래스에서 fly와 quack는 Duck을 구현하는 오리의 종류에 따라 달라질 수 있다.
그렇기 때문에 그 부분을 인터페이스를 이용하여 틀을 만들어 두고
실제로 동작하는 방식은 MallardDuck 클래스에서 설정해 주어 원하는 동작을 전략에 따라서 선택하고, 유연하게 대응할 수 있도록 되어있다.
MallardDuck과 같이 생성자에서 인터페이스 구현체를 정의할 수도 있지만,
setter(ex setflyBehavior)를 이용하여 런타임시에 인터페이스 구현체를 바꿔 줄 수 있다.
반응형