ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 전략 패턴과 템플릿 메서드 패턴의 차이
    공부정리/디자인패턴 2024. 2. 18. 17:33
    반응형

    나는 전략 패턴과 템플릿 메서드 패턴이 너무 헷갈린다.

    구현하고 보면 둘은 같은 패턴인 것 아닌가 싶었다.

    둘 다 서로로 변환하기 쉽고, 행동 패턴에 속하기 때문일까?

    개념이 제대로 잡혀 있지 않아서 그런걸까?

    아니면, 내가 둘을 크게 구분하지 않고 같이 쓰고 있기 때문일까?

     

    개념 공부부터 다시 해보자.

     

    반응형

    전략 패턴과 템플릿 메서드 패턴 요약

    전략 패턴

    동일 계열의 알고리즘을 정의하고, 각각의 알고리즘을 캡슐화하며, 이들을 상호 교환이 가능하도록 만드는 패턴입니다. 알고리즘을 사용하는 사용자와 상관없이 독립적으로 알고리즘을 다양하게 변경할 수 있게 합니다.
    - GoF의 디자인 패턴: 전략 패턴

    전략 패턴은 알고리즘을 캡슐화하고 이를 동적으로 교환할 수 있도록 하는 패턴입니다.주로 한 가지 작업을 수행하는 여러 알고리즘이 있을 때 사용됩니다.이 패턴은 알고리즘을 인터페이스를 통해 정의하고, 다양한 구현을 갖는 전략 클래스를 만듭니다.클라이언트는 전략 클래스를 주입하고, 실행 시에 필요한 알고리즘을 선택할 수 있습니다.
    - GhatGPT

     

    템플릿 메서드 패턴

    객체의 연산에는 알고리즘의 뼈대만을 정의하고 각 단계에서 수행할 구체적 처리는 서브클래스 쪽으로 미루는 패턴입니다. 알고리즘의 구조 자체는 그대로 놔둔 채 알고리즘 각 단계의 처리를 서브클래스에서 재정의할 수 있게 합니다.
    - GoF의 디자인 패턴: 템플릿 메서드 패턴

    템플릿 메서드 패턴은 상위 클래스에서 알고리즘의 구조를 정의하고, 하위 클래스에서 알고리즘의 구체적인 내용을 구현하는 패턴입니다.알고리즘의 일부분을 변경하고자 할 때 사용됩니다.템플릿 메서드 패턴은 상위 클래스에서 알고리즘의 뼈대를 정의하고, 하위 클래스에서 필요에 맞게 구체적인 구현을 제공합니다.하위 클래스에서는 특정 메서드를 재정의하여 알고리즘의 일부를 수정할 수 있습니다.
    - ChatGPT

     

    구현

    이것을 예로 들면 C#으로 구현할 때,

    전략 패턴은 알고리즘의 구현을 추상화 한 다음 퍼블릭 인터페이스로 정의하여 알고리즘의 선택과 실행을 분리할 수 있다. 

    템플릿 메서드 패턴은 추상클래스를 통해서 메서드들을 정의하고, 서브클래스에서 일부 메소드를 재정의한다.

    => 그러니까 이 부분에서 나는 클라이언트 관점에서는 인터페이스든 추상클래스든 대표적인 것 하나만 알면 되니까 여기서 헷갈린 것이었다. 

    헷갈리면 안 되는 부분이기도 했다.

     

    상속과 합성

    두 패턴의 가장 큰 차이는 상속 기반이냐 합성 기반이냐이다.

    전략 패턴은 합성을 기반으로 하며, 반면에 템플릿 메서드 패턴은 상속을 기반으로 한다.

     

    Gemini가 알려 주는 전략 패턴과 템플릿 메서드 패턴: 유사점과 차이점

    전략 패턴과 템플릿 메서드 패턴은 모두 알고리즘의 구현 방식을 유연하게 만들어주는 디자인 패턴입니다. 하지만 두 패턴은 다음과 같은 유사점과 차이점을 가지고 있습니다.

    1. 유사점

    • 알고리즘의 변화를 코드 변경 없이 수행 가능: 두 패턴 모두 알고리즘의 구현 부분을 추상화하여 캡슐화합니다. 이를 통해 알고리즘의 변화를 코드를 변경하지 않고도 런타임에 수행할 수 있습니다.
    • 코드의 재사용성 향상: 두 패턴 모두 공통적인 알고리즘 구조를 추상화하여 재사용 가능하게 합니다. 이를 통해 코드의 중복을 줄이고 유지 관리를 용이하게 합니다.

    2. 차이점

    구분 전략 패턴 템플릿 메서드 패턴
    알고리즘 구성 전체 알고리즘을 추상화하여 인터페이스로 정의합니다. 일부 알고리즘만 추상화하여 추상 클래스의 메서드로 정의합니다.
    알고리즘 변경 방식 인터페이스 구현체를 교체하여 알고리즘을 변경합니다. 서브 클래스를 재정의하여 알고리즘의 일부 단계를 변경합니다.
    상속 구조 클라이언트는 인터페이스를 통해 알고리즘을 사용합니다. 상속 관계는 존재하지 않습니다. 클라이언트는 추상 클래스를 상속하여 알고리즘을 사용합니다.
    활용 예시 정렬 알고리즘 선택, 데이터 압축 방식 선택 데이터 처리 프레임워크, 문서 편집기

     

     

    최근에 다 읽은 [오브젝트: 코드로 이해하는 객체지향 설계] 책에서 배운 것을 떠올리며 

    책임, 역할, 협력의 관점에서 보았을 때, 둘은 어떤 차이점이 있을까?

    전략 패턴과 템플릿 메서드 패턴의 책임, 역할, 협력 관점 차이

    1. 책임

    1) 전략 패턴

    • 인터페이스: 알고리즘의 공통적인 책임을 정의합니다.
    • 구체적인 전략 클래스: 인터페이스를 구현하고 알고리즘의 구체적인 책임을 수행합니다.
    • 클라이언트: 인터페이스를 통해 알고리즘을 선택하고 실행합니다.

    2) 템플릿 메서드 패턴

    • 추상 클래스: 알고리즘의 공통적인 책임과 일부 단계의 책임을 정의합니다.
    • 구체적인 템플릿 클래스: 추상 클래스를 상속받고 알고리즘의 일부 단계의 책임을 구체화합니다.
    • 클라이언트: 추상 클래스를 통해 알고리즘을 실행합니다.

    2. 역할

    1) 전략 패턴

    • 인터페이스: 알고리즘의 추상화 역할을 합니다.
    • 구체적인 전략 클래스: 알고리즘의 구현 역할을 합니다.
    • 클라이언트: 알고리즘의 선택 및 실행 역할을 합니다.

    2) 템플릿 메서드 패턴

    • 추상 클래스: 알고리즘의 틀 역할을 합니다.
    • 구체적인 템플릿 클래스: 알고리즘의 변형 역할을 합니다.
    • 클라이언트: 알고리즘의 실행 역할을 합니다.

    3. 협력

    1) 전략 패턴

    • 인터페이스를 통해 알고리즘의 의존성을 추상화합니다.
    • 클라이언트는 인터페이스를 통해 알고리즘을 선택하고 실행하여 협력합니다.

    2) 템플릿 메서드 패턴

    • 추상 클래스를 통해 알고리즘의 공통적인 구조를 정의하여 협력합니다.
    • 구체적인 템플릿 클래스는 추상 클래스를 상속받고 알고리즘의 일부 단계를 구체화하여 협력합니다.

    4. 결론

    • 전략 패턴: 알고리즘의 선택 및 변경에 유연성을 제공하는 데 중점을 둡니다.
    • 템플릿 메서드 패턴: 알고리즘의 공통적인 구조를 유지하면서 일부 단계만 변경하는 데 유연성을 제공하는 데 중점을 둡니다.
    반응형

    댓글

Designed by Tistory.