반응형
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;
}
반응형
'Design Patterns > Behavioral Patterns' 카테고리의 다른 글
Command Pattern (C++) (0) | 2019.12.22 |
---|---|
Chain of Responsibility Pattern (C++) (0) | 2019.12.15 |
Behavior Pattern (행동 패턴) (0) | 2019.12.15 |
Template Method Pattern (C++) (0) | 2019.08.04 |
Observer Pattern (C++) (0) | 2019.03.24 |