2012-08-26 5 views
1

은의 간단한 데코레이터 예를 들어 보자?데코레이터 패턴은 슈퍼 안티 패턴

call super는 파생 된 하위 클래스에서 사용자가 메서드를 재정의하고 특정 지점에서 재정의 된 함수 자체를 호출해야한다는 특정 클래스의 디자인 패턴입니다.

여기에 little different implementation 디자인에 차이가 있습니까?

+4

아니요, 수퍼 클래스를 호출하지 않으므로 super를 호출하지 않습니다. 포함 된 객체를 호출하고 있습니다. –

답변

6

이것은 최고급 통화가 아닙니다. 재정의 된 버전이 아닌 다른 IStuff 인스턴스의 Info 메서드를 호출합니다.

전화 슈퍼 버전 :

struct IStuff 
{ 
    virtual void Info() = 0; 
    virtual ~IStuff() { } 
}; 

class Stuff : public IStuff 
{ 
public: 
    void Info() { std::cout << "Basic stuff"; } 
}; 

class StuffDecorator : public IStuff 
{ 
    IStuff* decorated_; 
public: 
    StuffDecorator(IStuff* decoratedStuff) : 
     decorated_(decoratedStuff) {} 
    ~StuffDecorator() { delete decorated_; } 

    void Info() 
    { 
     decorated_->Info(); 
    } 
}; 

class Shiny : public StuffDecorator 
{ 
public: 
    Shiny(IStuff* stuff) : StuffDecorator(stuff) { } 

    void Info() 
    { 
    StuffDecorator::Info(); 
    std::cout << "->Shiny"; 
    } 
}; 

: 실내 장식의

struct IStuff { 
    // If you override this, you MUST call the base class version <-- call super 
    virtual void Info() 
    { 
    // a default implementation. 

    std::cout << "Super call "; 
    } 
    virtual ~IStuff() { } 
}; 

class Shiny : public IStuff { 
public: 
    void Info() { 
    IStuff::Info(); // don't forget to call base implementation. 
    std::cout << "->Shiny"; 
    } 
}; 

일부 구현은 데코레이터 기본 클래스에 슈퍼 전화를하고있다, 즉 장식 된 참조를 누르고 전화를 관리 할 책임이있다 수퍼 전화를 피하기 위해 Template Method

class StuffDecorator : public IStuff 
{ 
    IStuff* decorated_; 
public: 
    StuffDecorator(IStuff* decoratedStuff) : 
     decorated_(decoratedStuff) {} 
    ~StuffDecorator() { delete decorated_; } 

    void Info() 
    { 
     decorated_->Info(); 
     DoInfo(); 
    } 
private: 
    // Template method 
    virtual void DoInfo() = 0; 
}; 


class Shiny : public StuffDecorator 
{ 
public: 
    Shiny(IStuff* stuff) : StuffDecorator(stuff) { } 
private: 
    void DoInfo() 
    { 
    std::cout << "->Shiny"; 
    } 
}; 
+0

알겠습니다. 또한 [다른 구현] (http://www.vincehuston.org/dp/decorator.html) [내 여기에] (http://stackoverflow.com/questions/2988066/decorator-pattern- in-c) 당신의 전화 슈퍼 버전과 똑같이 보입니다 - 아니면 뭔가 간과 했나요? –

+0

@ JanTuroň 네 말이 맞아. 나는 내 대답을 편집하고 슈퍼 콜이없는 soultion을 제공했다. – hansmaad

관련 문제