티스토리 뷰

반응형

1. 커맨드 패턴의 개념


커맨드 패턴을 이용하면 요청하는 객체와 그 요청을 수행하는 객체를 분리시킬 수 있습니다.

여기서의 핵심은 분리시키기 위해 가장 필요한 커맨드 객체입니다.

리시버의 행동들을 캡슐화합니다.

Command Interface를 통해서 추상메소드를 호출할 수 있습니다.

각각의 Command들은 해당 리시버의 행동을 호출하게 됩니다.

Undo(작업취소 메소드)를 구현함으로 작업 취소 기능을 지원할 수 있습니다.

요청하는 객체(인보커) 자체는 고치지 않아도 되도록 하는 것에 가장 중점을 두었습니다.

요청하는 쪽과 수행하는 쪽을 분리시킴으로 느슨한 결합을 유지할 수 있습니다.


2. 클래스 다이어그램



3. 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//Client
int main()
{
    //Create Class
    Receiver receiver = new Receiver();
    ICommand command = new ConcreteCommand(receiver);
    Invoker invoker = new Invoker();
 
    //Set Command
    invoker->SetCommand(command);
    invoker.ExecuteCommand();
}
 
class ICommand
{
protected:
    Receiver* receiver;
 
public:
    ICommand(Receiver* pReceiver)
    {
        receiver = pReceiver;
    }
 
    virtual void execute() = 0;
}
 
//ConcreteCommand header
class ConcreteCommand : public ICommand
{
public:
    ConcreteCommand(Receiver* pReceiver);
 
    virtual void execute();
}
//end header
 
//ConcreteCommand body
ConcreteCommand(Receiver* pReceiver) :
    ICommand(pReceiver)
{
}
 
void ConcreteCommand::execute()
{
    receiver->sil_hang();
}
//end body
 
//Receiver header
class Receiver
{
public:
    Receiver();
 
    void sil_hang();
}
//end header
 
//Receiver body
Receiver()
{
}
 
void Receiver::sil_hang();
{
    TRACE("WoW Fantastic Baby");
}
//end body
 
//Invoker header
class Invoker
{
public:
    Invoker();
 
    void setCommand(ICommand* pCommand);
    void executeCommand();
 
private:
    ICommand command;
}//end header
 
//Invoker body
Invoker()
{
}

void Invoker::setCommand(ICommand* pCommand);
{
    command = pCommand;
}
 
void Invoker::ExecuteCommand()
{
    command.execute();
}
 
//end body
 
 
 r



4. 마무리

 - 각각의 행동을 객체로 캡슐화 하기 때문에 행동에 대한 확장성이 좋다고 볼 수 있습니다.

 - 하나의 행동객체는 하나의 행동만을 수행하는 것이 핵심입니다.

 - 객체지향 원칙의 단일책임원칙에 해당하는 부분임을 알 수가 있습니다.(책임을 각자 가져가는것)

 - 명령어(Command)를 처리하는 부분을 객체로 캡슐화 함으로 실제 구현을 다른 객체들로부터 독립시키는 것에 있습니다.

 - 실생활에서도 비슷한 상황이 있습니다.



반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함