2013-02-14 3 views
0

나는 디자인 패턴을 연구 중이다. C++에서 책임 패턴 체인을 구현하는 방법에 대해서는 잘 모르겠습니다. Argo 도구를 사용하여 다이어그램에서 코드를 생성합니다. enter image description here.책임 패턴 체인 C++

이 다이어그램에서 Oracle 클래스는 "클라이언트"입니다. Oracle.cpp 생성자 방법은 다음 라인 여기

#include "Oracle.h" 
Oracle::Oracle(){ 
    Validation v;//Here 
} 

나는 " '검증'은이 범위에서 선언되지 않은 오류"를 얻을 수있다. 내 질문 : Oracle에서 "Validation"으로 UML 관계 "dependency"를 만들어야합니까? 또는이 오류를 어떻게 해결할 수 있습니까?

+0

Validation.h를 Oracle.cpp에 포함 시켰습니까? – Deamonpog

+1

귀하의 질문은 구체적으로 ArgoUML을 사용하는 것이지 책임 패턴의 사슬에 관한 것이 아닙니다. 제목을 변경해야 할 수도 있습니다. – Ergwun

+0

@Damonpog 오라클에 Validation.h를 포함하지 않기 때문에 패턴 Chain of UML 다이어그램을 수정할 수 있습니다. – Juan

답변

1

Oracle 클래스에는 유효성 검사 유형의 멤버가 없어야하며, 대신 Handler 유형의 멤버가 있어야합니다.

물론 이것은 어딘가에 유효성 검사로 설정됩니다 (이것이 체인의 첫 번째 단계라고 가정합니다).

이제 체인을 제작해야하는데 체인의 단계는 다른 단계를 인식하지 않아야합니다.

두 가지 옵션이 있습니다. 오라클 클래스가 체인이 작동하는 방식을 알 수 있거나 (모든 종속성이 발생 함) 자체 빌드 할 수 있습니다. 또는 빌더 클래스가 체인을 빌드하고 Oracle 인스턴스 (바람직하게는 생성자를 통해)에 삽입해야합니다.

두 번째 옵션은 CoR 패턴의 철학을 가장 잘 준수합니다 (체인의 사용자는 내부 작업을 인식하지 못합니다).

아마 ArgoUML이 처리기의 인스턴스를 만들 수 있도록 유효성 검사에 대한 링크를 추가했지만 이상합니다.

또한 setNext 메소드가 Oracle 클래스에 속하지 않는다고 생각합니다. 이 클래스는 체인의 첫 번째 Handler 객체에 대한 참조가 필요하지만 생성자에서 가장 잘 설정됩니다. setter를 설정 한 경우 setHanlderChain과 같은 적절한 이름을 지정하여 용도를 명확하게 지정해야합니다.

코멘트에 응답에서 성공

:

책임의 체인의 요소가 체인 자체에 대한 지식이없는, 그것은 단지 참가자입니다. 어딘가에 체인을 만들어야합니다. 참여자를 인스턴스화하고 다음 단계를 설정하십시오. 당신이 예를 들어이 (마음이 당신은 내가 C++에서 심각한 아무것도 쓴 이후 오랜 시간이있다, 나는 당신의 클래스 다이어그램의 순서가 실행 순서라고 가정)

Handler buildOracleChain() 
{ 
    CalculePR step6 = new CalculePR(); 
    step1.setNext(null); 
    SolutionKE step5 = new SolutionKE(); 
    step5.setNext(step6); 
    CalculeSP step4 = new ValcvuleSP(); 
    step4.setNext(step5); 
    KeyGeneration step3 = new KeyGeneration(); 
    step3.setNext(step4); 
    Encrypt step2 = new Encrypt(); 
    step2.setNext(step3); 
    Validation step1 = new Validation(); 
    step1.setNext(step2); 
    return step1; 
} 
다음과 같을 수에 대한

두 번째 질문에 대해서는 실제 예제가 없습니다. 이 메소드를 빌더 클래스 (예 : OracleHandlerChainBuilder)에 넣으면 해당 클래스 만이 모든 단계를 가져와야하며 오라클 클래스는 핸들러 만 가져와야합니다.

오라클 인스턴스를 생성하면 해당 인스턴스의 체인 (setNext를 사용하여)을 빌드 메소드의 결과로 설정합니다. Oracle 클래스를 인스턴스화 할 클래스는 Oracle 클래스와 OracleHandlerChainBuilder 클래스를 모두 가져와야합니다.

이렇게하면 클래스 간의 종속성이 최소화됩니다.

+0

"또는 체인을 빌드하고 Oracle 인스턴스 (바람직하게는 생성자를 통해 생성자)에 삽입하는 빌더 클래스가 필요합니다." 나는이 패턴을 사용하는 새로운 것이다. – Juan

+0

C++에서 여러 개의 파일을 가지고이 패턴의 예가 있습니까? – Juan