Strategy Pattern (전략 패턴)

YeongUng Kim·2021년 4월 11일
1

디자인패턴

목록 보기
1/4
post-thumbnail

개발에서 중요하지 않은 분야가 뭐가 있겠냐 싶겠냐만은 나의 짧은 개발경험과 지식으로는 전체적인 소프트웨어 설계능력이 결국 모든 개발 프로세스의 알파이자 오메가라고 생각한다.
따라서 다자인패턴 분야의 필독서인 GoF의 디자인패턴을 참고하여 디자인패턴에 관한 내용을 포스팅하려고 한다. 여러 디자인 패턴이 있지만 실무에서 가장 많이 쓰이는 전략패턴부터 알아보고자 한다. 모든 디자인패턴을 포스팅 하는것을 목표로 한다. 출발


개요

동일한 계열의 알고리즘군을 정의하고 각 알고리즘군을 캡슐화하여 클라이언트와 상관없이 독립적으로 알고리즘을 목적에 맞게 변경할 수 있게 하는 패턴.


본론

Class Diagram

클래스 정의

  • Strategy(Compositor) : 제공하는 모든 알고리즘에 대한 공통의 연산들을 인터페이스화, Context는 인터페이스화된 Strategy를 통해서 구체화된 실제 알고리즘을 사용한다.

  • ImplA,ImplB : Strategy 인터페이스의 공통으로 묶어놓은 알고리즘을 실제로 구현한다.

  • Context : Strategy에 있는 참조자(ImplA,ImplB)를 관리한다. 즉, Strategy의 서브클래스 인스턴스를 가지고 있음으로써 구체화한다.

설명

Client는 필요하다고 판단되는 알고리즘을 선정하여 Context에게 요청한다. Context 클래스와 Strategy 클래스는 의사교환을 통해 선택한 알고리즘을 구현한다. Context는 연산에 필요한 데이터를 Strategy 클래스에 넘겨준다. 실제로 구현된 Impl 클래스는 Context와 함께 동작한다.


예제

Strategy(Developer)

// Strategy
public interface Developer {
    void runStrategy();
}

Context(Person)

public class Person {
    void doCoding(Developer developer){
        System.out.print("HI! ");
        developer.runStrategy(); // 전략 적용
    }
}

Impl(JavaDeveloper,CDeveloper) a.k.a ConcreteClass

public class JavaDeveloper implements Developer {
    @Override
    public void runStrategy() {
        // behavior
        System.out.println("Now, I am Java Developer");
    }
}
public class CDeveloper implements Developer {
    @Override
    public void runStrategy() {
        // behavior
        System.out.println("I am C Developer");
    }
}

Client

public class Client {
    public static void main(String[] args){
        Developer developer;
        Person person = new Person();
        developer = new CDeveloper();
        person.doCoding(developer);
        developer = new JavaDeveloper();
        person.doCoding(developer);
    }
}

코드 실행 결과

Hi! I am C Developer
Hi! Now, I am Java Developer

예제 Diagram

Context로 Person 을 구성하여 전략을 적용한 구체클래스의 알고리즘을 호출했다. Strategy 인터페이스를 구현한 CDeveloper,JavaDeveloper는 클라이언트에서 요청함에 따라 생성되어 각 알고리즘을 수행한다.


참고 : GoF의 디자인패턴

profile
기록하지 않으면 까먹어서 만든 블로그..

0개의 댓글