본문 바로가기
아키텍처/디자인 패턴

1. Strategy Pattern

by doflamingo 2020. 12. 9.

공부를 하다가 조금 더 기본적인 개념을 확실히 하고 가는게 좋을 것 같아서 디자인 패턴을 하나씩 적어보려 합니다.

 

Strategy Pattern은 스트레티지 패턴은 여러 알고리즘을 하나의 추상적인 접근점(인터페이스)으로 만들어 접근 점에서 서로 교환 가능(델리게이트)하도록 하는 패턴이다. 

그래서 필요 전략에 맞게 전략을 갈아 끼울 수도 있고 전략을 확장하기에도 용이하다.

Strategy Pattern

Strategy Pattern을 알기 위해서는 인터페이스와 델리게이트 개념을 먼저 알아야한다. 

 

인터페이스 (Interface)

인터페이스의 특징은 기능과 선언을 분리하고 기능을 사용하는 통로이다.

 

1. 기능과 선언을 분리한다.

인터페이스로 기능을 선언해주고 그 인터페이스를 구현하는 구현 클래스를 통해 실제 메소드의 기능을 구현한다.

public interface A {
  public void funcA();
}

public class AImpl implements A {
  @Override
  public void funcA() {
    System.out.println("A");
  }
}

 

2. 기능을 사용하는 통로이다. 

인터페이스 타입으로 객체를 선언하고 실제 구현클래스로 인스턴스를 생성할 수 있다.

public class Main {
  public static void main(String[] args) {
    A a = new AImpl();
    a.funcA();
  }
}

 

델리게이트 (Delegate)

객체간의 관계에서 위임하는 것을 의미한다.

특정 기능을 사용하기 위해 다른 객체의 기능을 호출하는 것을 의미한다.

 

public class B{
  private A a;
  
  public B() {
    a = new AImpl();
  }

  public void funcB() {
    a.funcA();
  }
}

A의 funcA를 funcB에서 사용해야하는데 class B에서 직접 구현하는 것이 아닌 A에게 위임하는 것을 델리게이트라한다.

 

위의 두 가지를 통해서 Strategy Pattern을 코드로 구현해보겠다. 

 

탈  것을 Strategy로 추상적인 접근점을 만들었다.

public interface Vehicle {
  public void ride();
}

 

 

구체적인 Strategy는 자동차, 자전거, 지하철로 만들었다. 

public class Bicycle implements Vehicle {

  @Override
  public void ride() {
    System.out.println("자전거를 탄다.");
  }
}
public class Car implements Vehicle {

  @Override
  public void ride() {
    System.out.println("자동차를 탄다.");
  }
}
public class Subway implements Vehicle {
  @Override
  public void ride() {
    System.out.println("지하철을 탄다.");
  }
}

 

학생이란 context에서 등교를 할때 어떤 방법으로 등교할지를 Strategy를 결정하면 된다.

public class Student {
  private Vehicle vehicle;

  public void setVehicle(Vehicle vehicle) {
    //구체적인 전략을 위임받는다.(delegate)
    this.vehicle = vehicle;
  }

  public void goToSchool() {
    System.out.println("집에서 출발한다.");
    if(vehicle == null)
      System.out.println("걸어 간다.");
    else
      vehicle.ride();
    System.out.println("학교에 도착한다.");
    System.out.println();

  }
}

Student객체에서 어떤 Strategy를 사용하느냐에 따라 등교방법이 바뀐다.

public class Main {
  public static void main(String[] args) {
    Student student = new Student();
    student.goToSchool();
    //전략으로 자전거를 세팅한다.
    student.setVehicle(new Bicycle());
    student.goToSchool();

    //전략으로 지하철을 세팅한다.
    student.setVehicle(new Subway());
    student.goToSchool();

    //전략으로 자동차를 세팅한다.
    student.setVehicle(new Car());
    student.goToSchool();

  }
}

 

결과 화면

 

코드

 

- 출처 -

youtu.be/UEjsbd3IZvA

kscory.com/dev/design-pattern/strategy     

'아키텍처 > 디자인 패턴' 카테고리의 다른 글

5. Singleton Pattern  (0) 2020.12.13
4. Factory Method Pattern  (0) 2020.12.13
3. Template Method Pattern  (0) 2020.12.13
2. Adapter Pattern  (2) 2020.12.10

댓글