[design-patterns] 템플릿 방법과 전략 패턴의 차이점은 무엇입니까?

누군가 템플릿 방법 패턴과 전략 패턴의 차이점이 무엇인지 설명해 주시겠습니까?

내가 알 수있는 한 99 % 동일하다는 점은 템플릿 메서드 패턴에 기본 클래스와 같은 추상 클래스가 있고 전략 클래스는 각 구체적인 전략 클래스에 의해 구현되는 인터페이스를 사용한다는 것입니다.

그러나 고객 에 관한 한 정확히 동일한 방식으로 소비됩니다. 이것이 맞습니까?



답변

이 둘의 주요 차이점은 구체적 알고리즘을 선택할 때입니다.

Template 메소드 패턴을 사용하면 템플리트서브 클래 싱 하여 컴파일 타임 에 발생 합니다. 각 서브 클래스는 템플릿의 추상 메소드를 구현하여 다른 구체적인 알고리즘을 제공합니다. 클라이언트가 템플릿의 외부 인터페이스 메서드를 호출하면 템플릿을 호출하여 알고리즘을 호출하는 데 필요한 추상 메서드 (내부 인터페이스)를 호출합니다.

class ConcreteAlgorithm : AbstractTemplate
{
    void DoAlgorithm(int datum) {...}
}

class AbstractTemplate
{
    void run(int datum) { DoAlgorithm(datum); }

    virtual void DoAlgorithm() = 0; // abstract
}

대조적으로, 전략 패턴은 알고리즘에이 선택 될 수 있도록 실행 에 의해 봉쇄 . 구체적인 알고리즘은 생성자 또는 setter 메서드에 매개 변수로 전략에 전달되는 별도의 클래스 또는 함수로 구현됩니다. 이 매개 변수에 대해 선택된 알고리즘은 프로그램의 상태 또는 입력에 따라 동적으로 달라질 수 있습니다.

class ConcreteAlgorithm : IAlgorithm
{
    void DoAlgorithm(int datum) {...}
}

class Strategy
{
    Strategy(IAlgorithm algo) {...}

    void run(int datum) { this->algo.DoAlgorithm(datum); }
}

요약해서 말하자면:

  • 템플릿 메소드 패턴 : 서브 클래 싱에 의한 컴파일 타임 알고리즘 선택
  • 전략 패턴 : 격리에 의한 런타임 알고리즘 선택

답변

템플릿 패턴은 특정 작업에 다른 다양한 기본 동작과 관련하여 정의 할 수있는 일정하지 않은 동작이있을 때 사용됩니다. 추상 클래스는 불변 동작을 정의하고 구현 클래스는 종속 메소드를 정의합니다.

전략에서 행동 구현은 독립적입니다. 각 구현 클래스는 행동을 정의하며 그들 사이에 코드가 공유되지 않습니다. 둘 다 행동 패턴이며, 따라서 클라이언트는 거의 같은 방식으로 소비합니다. 일반적으로 전략에는 단일 공용 메소드 ( execute()메서드)가 있지만, 템플리트는 서브 클래스가 구현해야하는 지원 개인용 기본 세트뿐만 아니라 공개 메소드 세트를 정의 할 수 있습니다.

두 패턴을 쉽게 함께 사용할 수 있습니다. 템플릿 패턴을 사용하여 구현 된 전략 군에 여러 구현이 속하는 전략 패턴이있을 수 있습니다.


답변

두 패턴의 클래스 다이어그램이 차이점을 보이고 있다고 생각합니다.

전략
클래스 내부의 알고리즘을 캡슐화합니다.
이미지에 연결
여기에 이미지 설명을 입력하십시오

템플릿 메소드
연기 서브 클래스에 대한 알고리즘의 정확한 단계
이미지 링크
여기에 이미지 설명을 입력하십시오


답변

아마도 템플릿 메소드 패턴을 의미 할 것입니다. 당신은 옳습니다, 그들은 매우 비슷한 요구를 제공합니다. 서브 클래스가 이러한 단계를 재정 의하여 세부 사항을 변경하는 단계를 정의한 “템플릿”알고리즘이있는 경우 템플리트 메소드를 사용하는 것이 좋습니다. 전략의 경우 인터페이스를 작성해야하며 상속 대신 위임을 사용하고 있습니다. 나는 그것이 좀 더 강력한 패턴이라고 말하고 DIP 의존성 역전 원칙에 따라 더 좋을 것이라고 말했다. 템플릿 방법에는 적용되지 않는 무언가를 수행하는 방법 인 새로운 전략 추상화를 명확하게 정의하기 때문에 더욱 강력합니다. 따라서이 추상화가 의미가 있다면 사용하십시오. 그러나 템플릿 방법을 사용하면 간단한 경우에 더 단순한 디자인을 제공 할 수도 있습니다. 어떤 단어가 더 잘 맞는지 고려하십시오. 템플릿 알고리즘이 있습니까? 아니면 전략의 추상화를 가지고 있다는 것이 핵심입니다.

템플릿 방법의 예 :

Application.main()
{
Init();
Run();
Done();
}

여기에서 응용 프로그램에서 상속하고 init, run 및 done에서 수행 할 작업을 정확하게 대체합니다.

전략의 예 :

array.sort (IComparer<T> comparer)

여기서 비교자를 작성할 때 배열에서 상속하지 않습니다. 배열은 비교 알고리즘을 비교 자에게 위임합니다.


답변

전략과 템플릿 방법의 차이점 패턴 전략과 템플릿 방법


유사점

전략과 템플릿 방법 패턴은 서로 유사합니다. 전략 및 템플릿 방법 패턴은 모두 공개 원칙을 충족하고 코드를 변경하지 않고도 소프트웨어 모듈을 쉽게 확장 할 수 있도록하는 데 사용할 수 있습니다. 두 패턴 모두 해당 기능의 세부 구현에서 일반 기능이 분리 된 것을 나타냅니다. 그러나 제공하는 세분성 측면에서 약간 다릅니다.


차이점

다음은이 두 가지 패턴을 연구 할 때 관찰 한 몇 가지 차이점입니다.

  1. 전략에서는 클라이언트와 전략의 연결이 느슨하지만 템플릿 방법에서는 두 모듈이 더 밀접하게 연결됩니다.
  2. Strategy에서는 상황에 따라 abstract 클래스를 사용할 수 있지만 대부분 인터페이스가 사용되며 구체적 클래스는 사용되지 않지만 Template 메서드에서는 주로 abstract 클래스 또는 concrete 클래스가 사용되며 인터페이스는 사용되지 않습니다.
  3. 전략 패턴에서 일반적으로 클래스의 전체 동작은 인터페이스 측면에서 표현되지만, 템플릿 방법은 코드 중복을 줄이기 위해 사용되며 상용구 코드는 기본 프레임 워크 또는 추상 클래스로 정의됩니다. 템플릿 메소드에는 기본 구현으로 구체적인 클래스가있을 수도 있습니다.
  4. 간단히 말하면 전략 패턴에서 전체 전략 (알고리즘)을 변경할 수 있지만 템플릿 방법에서는 일부 내용 만 변경되고 (알고리즘의 일부) 나머지 내용은 변경되지 않습니다. 템플릿 방법에서 변하지 않는 단계는 추상 기본 클래스로 구현되는 반면 변형 단계에는 기본 구현이 제공되거나 전혀 구현되지 않습니다. 템플릿 방법에서 구성 요소 디자이너는 알고리즘의 필수 단계와 단계 순서를 지시하지만 구성 요소 클라이언트는 이러한 단계 중 일부를 확장하거나 대체 할 수 있습니다.

물린 블로그 에서 이미지를 가져옵니다 .


답변

상속 대 집계 (is-a vs has-a). 동일한 목표를 달성하는 두 가지 방법이 있습니다.

이 질문은 선택 사이의 일부 상충 관계를 보여줍니다. 상속과 집계


답변

둘 다 매우 유사하며 클라이언트 코드가 비슷한 방식으로 소비합니다. 위의 가장 인기있는 답변과 달리 둘 다 런타임에 알고리즘을 선택할 수 있습니다 .

이 둘의 차이점은 전략 패턴이 다른 구현에서 원하는 결과를 달성하기 위해 완전히 다른 방식을 사용할 수 있지만 템플릿 방법 패턴 은 결과를 달성하는 데 사용되는 포괄적 인 알고리즘 ( “템플릿”방법)을 지정한다는 것입니다. -특정 구현 (서브 클래스)에 남겨진 유일한 선택은 상기 템플릿 방법의 특정 세부 사항이다. 이것은 템플리트 메소드가 자체적으로 서브 클래스에 의해 오버라이드되지 않은 템플리트 메소드와 달리 서브 클래스에 의해 대체되는 (즉, 구현 된) 하나 이상의 추상 메소드를 호출하게함으로써 수행됩니다. .

클라이언트 코드는 전략 패턴을 사용하는 것처럼 런타임에 결정될 수있는 구체적인 하위 클래스 중 하나의 인스턴스를 가리키는 추상 클래스 유형의 참조 / 포인터를 사용하여 템플리트 메소드를 호출합니다.