2013-01-10 3 views
3

두 클래스가 있습니다. 하나는 데이터베이스 (이미 구현 됨)에서 데이터를 가져 오는 작업이고 다른 하나는 File (지금 구현 중)에서 가져 오는 작업입니다. 여기서는 스트리밍 (데이터베이스 또는 파일)을 전환 할 수 있기를 바랍니다. 데이터베이스 또는 파일인지 확인하는 프로세스는 한 번만 필요합니다. 그래서 클래스의 각 메서드에 대해이 메서드가 호출 될 때마다 사용해야 할 내용을 매번 확인하고 싶지 않습니다.하나의 조건이 정의 된 후에 항상 클래스를 사용하십시오.

if(IsDataBaseStream()) 
    Database::execQuery("SELECT * from table"); 
else //is FileStream 
    File::GetAllFrom("Table"); 

이 못생긴 다음과 같이 지금은 , 내가 할. 나는 이것을 거부한다. 콜백에 대해 생각했지만 다른 클래스 간에는 작동하지 않습니다.

그런 프로세서 작업을 낭비하지 않는 방법이 있습니까?

미리 감사

+3

한 번 사실이라면 항상 사실입니까? 가상 비용은 없습니다. – GManNickG

+1

@GManNickG Shhh ... 그는 그 일을 거부합니다. –

+0

@GManNickG 해보고 싶지 않습니다. –

답변

10

에 당신은 Strategy Design Pattern를 사용해야합니다. 두 클래스 모두에게 데이터를 가져 오는 추상 메소드를 가진 공통 기본을 제공하고, 그 기본 클래스에 대한 포인터를 만든 다음, 단일 확인 후에 포인터를 파일 기반 또는 db 기반 구현에 할당하십시오.

struct BaseStream { 
    virtual void process(); 
}; 
struct FileStream : public BaseStream { 
    virtual void process() { 
     File::GetAllFrom("Table"); 
    } 
}; 
struct DBStream : public BaseStream { 
    virtual void process() { 
     Database::execQuery("SELECT * from table"); 
    } 
}; 
... 
BaseStream *s; 
if (IsDataBaseStream()) { 
    s = new DBStream; 
} else { 
    s = new FileStream; 
} 
... 
s -> process(); 
+0

또는 다형성 대신 템플릿 또는 일반 함수 (사용 사례에 따라 다름). –

+0

@MooingDuck 예, 맞습니다. 가장 일반적인 레벨에서 OP는 추가 수준의 간접 지정이 필요합니다. Strategy Pattern의 관용구는 C++과 잘 어울린다. 함수 포인터와 이것 저것이 바로 그 일을 할 수있다. – dasblinkenlight

+2

그들은 이것을 * 전략 디자인 패턴이라고 부릅니까? 나는 개인적으로이 상속이라고 부른다. (싸움을하려고하지는 않지만 DP 커뮤니티는 단순한 것이 소리보다 더 복잡하게 만드는 이름을 만드는 경향이 있습니다.) –

관련 문제