이번에 코딩해본 패턴은 프록시 패턴. 어떻게 보면 캡슐화 하는 것도 ‘특성의 일종’이라고 생각하고 하나의 클래스에서는 하나의 특성이라는 걸 만족시키기 위해서 클래스에서 떼어내 구현한 것이라 할 수 있겠다.



- 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴

장점 1. 접근하는 부분을 수정, 제어하기 간편하다.

장점 2. 무조건 한번의 뎁스를 거쳐야 하기 때문에 캡슐화가 더 견고하다.



// 정보 추상 클래스
class State{
public:
    virtual ~State() = 0;

    virtual void printState() = 0;
};
State::~State(){}
// 사람 정보
class HumanState : public State{
public:
    HumanState(char* name) : _name(name), _ap(10), _dp(10), _dead(false) {}
    ~HumanState(){}

    void printState(){
        cout << "name : " << _name << endl;
        cout << "dead : " << _dead << endl;
        cout << "ap : " << _ap << endl;
        cout << "dp : " << _dp << endl;
    }

    char* _name;
    int _ap;
    int _dp;
    bool _dead;
};
// 사람 정보 프록시
class HumanStateProxy : public State{
public:
    HumanStateProxy(HumanState* state) : _state(state) {}
    HumanStateProxy(char* name) : _state(new HumanState(name)) {}
    ~HumanStateProxy() {}

    char* getName(){
        return _state->_name;
    }
    void addAp(int add){
        if (add > 0){
            _state->_ap += add;
        }
    }
    void addDp(int add){
        if (add > 0){
            _state->_dp += add;
        }
    }
    int getAp(){
        return _state->_ap;
    }
    int getDp(){
        return _state->_dp;
    }
    void setDead(bool dead){
        _state->_dead = dead;

        if (dead){
            _state->_ap = 0;
            _state->_dp = 0;
        }
    }
    bool isDead(){
        return _state->_dead;
    }
    void printState(){
        _state->printState();
    }
private:
    unique_ptr<HumanState> _state;
};

int main(){
    auto s = new HumanStateProxy("SwordMan");
    
    s->addAp(10);
    s->addAp(-10);
    s->printState();
    cout << endl;

    s->setDead(true);
    s->printState();

    return 0;
}