728x90

알고리즘을 특정 상황에서 효율적으로 사용하는 것이 가장 좋습니다. 만약 어떤 정수 배열 클래스가 있을 때 객체의 내부를 정렬하려할 때 여러 알고리즘 중에서 특정 상황에 맞는 알고리즘을 사용하게 만드는 것이 좋습니다. 

 

간단하게는 분기문을 통해서 정렬을 수행할 수 있습니다. 

class Array {
    Array(int numofitem = 1024) {
        pData = new int[numofitem];
        m_itemcount = numofitem;
    }
    void creatdata() {
        for (int i = 0; i < m_itemcount ; i++) {
            pData[i] = rand() % 10000;
        }
    }
 
    void sort(int AlogrithmType) {
        switch(AlogrithmType) {
        case BUBBLE:	bubblesort(); break;
    	case QUICK:     quicksort(); break;
        default:        cout << "No match sort Algorithm";
    	}
    }
private:
    int* pData;
    int m_itemcount;
};

이럴 경우에 새로운 알고리즘이 추가, 삭제되면 sort 함수내의 분기문을 수정해야 합니다. 이런 과정 없이 새로운 알고리즘을 사용하기 위해서는 클래스 상속을 이용해서 하나의 인터페이스를 통해 접근하도록 하면 됩니다.

새로운 알고리즘을 사용하려고 한다면 SortAlgorithm을 상속받는 하위 클래스를 정의하고 Sort 함수 내의 Sort에 구현을 해주면 됩니다.

class SortAlgorithm { 
    static SortAlgorithm* createInstance() { return 0; }
    virtual void Sort(int numofitem, int* pArray);
}

class Bubble : public SortAlgorithm {
    static Bubble* createInstance() {
        if ( pInstance == 0 } { pInstance = new Bubble; }
        return pInstance;
    }
    void Sort(int numofitme, int* pArray) { cout << "Bubble sort"; }
private:
    static Bubble* pInstance;
}

class Array {
    Array(int numofitem = 1024) {
        pData = new int[numofitem];
        m_itemcount = numofitem;
    }
    void creatdata() {
        for (int i = 0; i < m_itemcount ; i++) {
            pData[i] = rand() % 10000;
        }
    }
    void sort() { pSortAlgorithm->Sort(m_itemcount, pData); }
    void setSortAlogrithm(SortAlgorithm* pNew) { pSortAlgorithm = pNew; }
private:
    int* pData;
    int m_itemcount;
    SortAlgorithm* pSortAlgorithm;
};

int main()
{
    Array a(10);
    a.createData();
    Bubble* pBubble = Bubble::createInstance();
    
    a.setSortAlgorithm(pBubble);
    a.sort();
}

이런식으로 원하는 알고리즘을 하나의 인터페이스로 접근하고 새로운 알고리즘이 개발되더라도 기존의 소스코드를 수정하지 않고 사용하는 방식을 전략 패턴이라고 합니다. 이 전략 패턴을 구현할 때 사용하고자 하는 알고리즘을 사용자가 선택하느냐 아니면 내부에서 자동으로 선택하도록 하는 방법이 있습니다. 

728x90

'Programming > C++' 카테고리의 다른 글

C++ 방문자 패턴  (0) 2021.06.20
C++ 템플릿 메소드 패턴  (0) 2021.06.20
C++ 상태 패턴  (0) 2021.06.13
C++ 옵저버 패턴  (0) 2021.06.13
C++ 메멘토 패턴  (0) 2021.06.10

+ Recent posts