>  기사  >  백엔드 개발  >  C++ 디자인 패턴의 템플릿 메소드 패턴에 대한 간략한 소개

C++ 디자인 패턴의 템플릿 메소드 패턴에 대한 간략한 소개

黄舟
黄舟원래의
2017-01-18 14:54:531339검색

템플릿 메서드 패턴: 작업에서 알고리즘의 골격을 정의하고 일부 단계는 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다.

적절한 시기: 특정 세부 수준에서는 일관된 프로세스나 일련의 단계를 완료하고 싶지만 더 세부적인 수준에서 개별 단계의 구현이 다를 수 있는 경우 일반적으로 다음을 고려합니다. 템플릿 메서드 패턴을 사용하여 처리합니다.

템플릿 메소드의 두 가지 역할:

추상 클래스(AbstractClass): 최상위 로직의 프레임워크 제공

구체 제품 클래스(ConcreteClass): 정의를 구현할 때 상위 클래스 하나 이상의 추상 메소드. AbstractClass는 여러 개의 ConcreteClass를 가질 수 있습니다.

구조 다이어그램:

C++ 디자인 패턴의 템플릿 메소드 패턴에 대한 간략한 소개


테스트 케이스:

[code]int main(){
    AbstractClass *pAbstractA = new ConcreteClassA;
    pAbstractA->TemplateMethod();  //Output: ConcreteA Operation1 ConcreteA Operation2

    AbstractClass *pAbstractB = new ConcreteClassB;
    pAbstractB->TemplateMethod();   //Output: ConcreteB Operation1 ConcreteB Operation2

    if(pAbstractA) delete pAbstractA;
    if(pAbstractB) delete pAbstractB;

    return 0;
}

템플릿 메소드 구현:

[code]class AbstractClass{
public:
    void TemplateMethod(){  //统一的对外一个接口
        PrimitiveOperation1();
        PrimitiveOperation2();
    }
protected:
    virtual void PrimitiveOperation1(){  //原始操作1
        std::cout << "Default Operation1\n";
    }
    virtual void PrimitiveOperation2(){  //原始操作2
        std::cout << "Default Operation2\n";
    }
};

class ConcreteClassA: public AbstractClass{
protected:
    //重载方法1和2
    virtual void PrimitiveOperation1(){
        std::cout << "ConcreteA Operation1\n";
    }
    virtual void PrimitiveOperation2(){
        std::cout << "ConcreteA Operation2\n";
    }
};

class ConcreteClassB: public AbstractClass{
protected:
    virtual void PrimitiveOperation1(){
        std::cout << "ConcreteB Operation1\n";
    }
    virtual void PrimitiveOperation2(){
        std::cout << "ConcreteB Operation2\n";
    }
};

템플릿 메소드 기능:

템플릿 메소드 패턴은 변경되지 않은 동작을 상위 클래스로 이동하고 하위 클래스에서 중복 코드를 제거함으로써 장점을 반영합니다.

템플릿 메서드 패턴은 좋은 코드 재사용 플랫폼을 제공합니다.

위 내용은 C++ 디자인 패턴 중 템플릿 메소드 패턴에 대한 간략한 소개 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.