Design Patterns/Behavioral Patterns

Strategy Pattern (C++)

개발새발 2019. 7. 7. 23:16
반응형

Strategy Pattern (C++)

목적

동일 계열의 알고르즘군을 묶어서 인터페이스를 통해 제공하고 클라이언트 입장에서 이를 상호교환이 가능하도록 만든다.

상황에 맞게 유연하게 알고리즘 교체를 목적으로 한다.

 

 

사용 시나리오

  • 리눅스에서 여러 I/O 스케줄링 방법이 존재한다. (알고리즘 군이 될 FIFO, Round Robin, Shortest Remaining Time 예제에서는 세개만 사용)
  • 오너 사용자가 스케줄링 방법을 변경할 수 있도록 시스템을 만든다.

[Strategy]

인터페이스 역할을 하는 Base strategy를 정의한다.

 

class Scheduler {
public:
    virtual void doSchedule() = 0;
    
};

 

[ConcreteStrategy]

Base strategy를 구체화 하는 클래스를 정의한다. 리눅스 I/O 스케줄링이라는 동일 계열의 알고리즘 군들

 

class FIFO : public Scheduler {
public:
    virtual void doSchedule() {
        cout<<"FIFO Scheduler"<<endl;
    }
};

class RR : public Scheduler {
public:
    virtual void doSchedule() {
        cout<<"RR Scheduler"<<endl;
    }
};

class SRT : public Scheduler {
public:
    virtual void doSchedule() {
        cout<<"SRT Scheduler"<<endl;
    }
};

 

[Context]

class System {
public:
    void setScheduler(Scheduler* scheduler) {
        myScheduler = scheduler;
    }
    void doSchedule() {
        myScheduler->doSchedule();
    }

private:
    Scheduler* myScheduler;
};

 

[사용 예]

알고리즘을 동적으로 변경하면서 사용 가능 하며 알고리즘(스케줄링) 을 교체할 때 마다 분기 코드를 작성하지 않아도 된다.

 

int main(int argc, const char * argv[]) {
    
    System* mySystem = new System();
    Scheduler* myScheduler = new FIFO();
    
    mySystem->setScheduler(myScheduler);
    mySystem->doSchedule();
    
    delete myScheduler;
    
    myScheduler = new RR();
    mySystem->setScheduler(myScheduler);
    mySystem->doSchedule();
    
    return 0;
}
반응형