반복자( iterator )
Posted 2012. 10. 23. 19:01주요 키워드는 "반복적인 행동의 일반화"
- Filed under : 디자인 패턴/4. 반복자( Iterator )
주요 키워드는 "반복적인 행동의 일반화"
명령어 클래스와 인수 클래스를 만들어 명령어 클래스는 명령어에 대해서만 해석하고
인수 클래스는 어떠한 종류의 인수인지만 해석하여 저장하면 그 두 클래스 모두 표현 클래스를
부모에 두고 복합체 패턴 형식으로 결합하여 명령을 수행만 하면 끝이다.
만약 수식이 필요해졌다고 하면 수식 클래스에 표현 클래스를 상속하여 작성하면 된다.
요청 자체를 객체화 하는것. 그리고 서로 다른 요청을 객체화 하여 클라이언트에게
파라미터로 넘겨 줄 수 있게 한다.
명령의 발동과 명령 수행의 분리 패턴하기 때문에 종속성을 제거하여 결합도를 낮출수 있다.
얼마든지 동적으로도 같은 메뉴에 다른 기능을 연결하게 할 수 있다.
명령패턴은 복합체 패턴과 융화되어 매크로 기능을 구현할수있다.
아래 코드는 명령 클래스와 그 서브 클래스를 나타낸 것인데 Execute()라는 매서드를 발동시킴으로써
명령 수행에 대한 일반화를 시켰다. 다른 기능들, 복사하기, 취소하기 등등도 Execute()로 발동된다.
그리고 취소하기 같은 경우, 명령 클래스들에 명령 수행전 명령 히스토리에 해당 명령을 저장하게
함으로써 가능하게 된다. 그 명령 히스토리의 역으로 반대의 명령을 실행하면 취소하기(Undo)가된다.
// 명령 추상 클래스
class Command
{
public:
virtual ~Command();
virtual void Execute() = 0;
protected:
Command();
};
// 문서 열기 클래스
class OpenCommand : public Command
{
public:
OpenCommand( Application*);
virtual void Execute();
protected:
virtual const char* AskFileName();
private:
Application* m_app;
};
// 문서 열기 생성자( 응용프로그램 포인터를 저장 )
OpenCommand::OpenCommand( Application* a )
{
_app = a;
}
// 문서 열기 명령 수행( Document = 응용 프로그램내 문서 클래스 )
void OpenCommand::Execute()
{
const char* name = AskFileName();
if( name != NULL )
{
Document* doc = new Document( name );
_app->Add(doc);
doc->Open();
}
}