본문 바로가기
공부/Java

전략패턴 vs 상태패턴

by JERO__ 2022. 4. 26.

결론

  • 전략패턴 : 한 번 인스턴스 생성하고 난 뒤, 상태가 거의 바뀌지 않을 때 사용
  • 상태패턴 : 한 번 인스턴스 생성하고 난 뒤, 상태가 빈번하게 바뀔 때 사용

디자인패턴

  • (소프트웨어) 디자인 + (공통적으로 마주치는 문제를 해결하는 방법의) 패턴

1. 전략패턴

  • 각각의 알고리즘군을 교환이 가능하도록 별도로 정의하고 각 캡슐화한 후 서로 교환해서 사용
  • 구조

  • 장점
    • 코드 중복 방지
    • 확장성 및 알고리즘 변경 용이

예시

  • 오리 종류 (한번 정하면 잘 바뀌지 않음)
    • 날 수 있음
    • 날 수 없음
    • 수영할 수 있음
    • 수영할 수 없음
  • 인터페이스 (해당 예시는 자동차)
public interface CarMoveBehavior {
    public void action();
}
  • 인터페이스 Impl
class UpBehavior implements CarMoveBehavior{ 
    @Override public void action() { 
        System.out.println("Up!"); 
    } 
} 
 
class DownBehavior implements CarMoveBehavior{ 
    @Override public void action(){ 
        System.out.println("Down!"); 
    } 
} 
 
class LeftBehavior implements CarMoveBehavior{ 
    @Override public void action(){ 
        System.out.println("Left!"); 
    } 
} 
 
class RightBehavior implements CarMoveBehavior{ 
    @Override public void action(){ 
        System.out.println("Right!"); 
    } 
}
  • 인터페이스 사용 클래스
public class Car {
    private CarMoveBehavior carMoveBehavior;
    
    public Car(CarMoveBehavior carMoveBehavior) {
        this.carMoveBehavior = carMoveBehavior;
    }
    
    public void move(){
        carMoveBehavior.action();
    }
    
    public void setMoveBehavior(CarMoveBehavior carMoveBehavior)
    {
        this.carMoveBehavior = carMoveBehavior;
    }
}
  • main
public class Main {
    public static void main(String[] args) {
        
        System.out.println("=====Java Strategy Pattern=====");
        
        //Up
        Car car1 = new Car(new UpBehavior()); 
        car1.move(); 
        
        //Down
        Car car2 = new Car(new DownBehavior()); 
        car2.move();
        
        //Left
        car2.setMoveBehavior(new LeftBehavior()); 
        car2.move();
        
        //Right
        car2.setMoveBehavior(new RightBehavior()); 
        car2.move();
    }
}

2. 상태패턴

  • 객체 자신의 내부 상태에 따라 행위를 변경하도록 하는 패턴
  • 객체의 상태에 따라 달라질 때, Enum으로 정의해야 함

예시(마리오)

  • 상태에 따라 다른 행위를 반환

장점

  • 상태에 따른 행동을 국소화하며 서로 다른 상태에 대한 행동을 별도의 객체로 관리함
    • 새로운 상태가 추가되더라도 Context 코드가 받는 영향이 적음
  • 상태전이를 명확하게 만듦
  • 상태에 따른 동작을 구현한 코드를 수정하기 쉬움

댓글