Command Pattern

김민오·2022년 7월 21일

개요

커맨드 패턴은 요청을 객체로 캡슐화하여 관리하는 패턴이다.

보통 커맨드 패턴을 설명할 때 리모컨을 예시로 많이 드는편이다.
우리가 TV나 에어컨을 리모컨으로 켜고 끌 때 굳이 리모컨이 아니더라도 각종 복잡한 전자기기의 버튼을 눌러서 우리가 원하고자하는 기능을 동작시킨다.

이 때 사용자입장에서는 그 버튼이 어떤 원리로 기기를 동작시키는지는 알 필요가 없다. 단순히 '버튼을 누른다'라는 행위만 알고 있으면 된다. TV를 켜기위해서 리모컨이 버튼을 누를때 리모컨 내부의 어떤 모듈이 특정한 신호를 TV로 보내서 . . . 이런 복잡한 이론을 다 알고있는 상태로 버튼을 누르는게 아니지않은가?

커맨드 패턴은 요청을 즉, 우리가 기대하고자하는 동작을 캡슐화로 은닉화하는 전략이다. "복잡하게 생각할거없고 이거 한방만 누르면 다 해결됩니다!" 같은 느낌?

Code

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class Command {
public:
    virtual void execute(void) = 0;
    virtual ~Command(void) {};
};

class GraphicDevice : public Command {
public:
    GraphicDevice() {
    }
    void execute() {
        cout << "Exectue GraphicDevice Command" << endl;
    }
private:
};

class SoundDevice : public Command {
public:
    SoundDevice() {

    }
    void execute(void) {
        cout << "Exectue SoundDevice Command" << endl;
    }
private:
};

class IODevice : public Command {
public:
    IODevice() {

    }
    void execute(void) {
        cout << "Exectue IODevice Command" << endl;
    }
private:
};

class CmdList {
public:
    void add(Command* c) {
        commands.push_back(c);
    }
    void executeCommandList(void) {
        for (vector<Command*>::size_type x = 0; x < commands.size(); x++) {
            commands[x]->execute();
        }
    }
private:
    vector<Command*> commands;
};

int main(void) {
    CmdList list;

    SoundDevice soundDevice;
    GraphicDevice graphicDevice;
    IODevice ioDevice;

    //Create Recipe
    list.add(&soundDevice);
    list.add(&graphicDevice);
    list.add(&ioDevice);
    list.executeCommandList();
    return 0;
}

Output

profile
https://github.com/gimhema, https://gimhema.tistory.com/

0개의 댓글