[Design Pattern] 13. Proxy Pattern
이번에 코딩해본 패턴은 프록시 패턴. 어떻게 보면 캡슐화 하는 것도 ‘특성의 일종’이라고 생각하고 하나의 클래스에서는 하나의 특성이라는 걸 만족시키기 위해서 클래스에서 떼어내 구현한 것이라 할 수 있겠다.
- 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴
장점 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;
}