적응자( Adapter )
Posted 2012. 10. 22. 17:41적응자 패턴엔 두가지 종류가 있다.
1. 객체 어댑터 패턴 Object Adapter Pattern
이 타입의 어댑터 패턴에서 어댑터는 감싸야할 클래스의 객체를 포함하고 있다.
이러한 상황에서 어댑터는 감싸진 객체를 호출하는 일을 한다.
집합관계를 이용한 새로운 객체를 두는 방식.
기존 클래스의 함수를 오버라이드 할 수 없다.
ex) 여러 직업이 있다. 전사, 마법사, 힐러 등등, 전사도 Level 1짜리 힐 능력을 주고 싶은데
인터페이스가 다른게 문제다.
class AidKid
{
};
class Fighter
{
private:
public:
virtual void cure(AidKit *) = 0;
virtual void attack() = 0;
virtual void defense() = 0;
void cFighter(){ cout << "class figher" << endl; }
};
class Healer
{
public:
void healing(int Level)
{
cout << "Level : " << Level << "Healing 시전" << endl;
}
void magic_attack();
void magic_defense();
};
class AdvFighter : public Fighter
{
private:
Healer *heal;
int healLevel;
public:
AdvFighter(Healer *h)
{
heal = h;
healLevel = 1;
}
void attack(){ cout << "Attack" << endl; }
void defense(){ cout << "Defense" << endl; }
void setHealLevel( int Lev ){ }
// 레벨업 되면서 힐러의 healing 마법을 쓸수 있게 되었다.
// 기존의 붕대 스킬은 그대로 둔채 새로운 스킬을 추가해도 된다
void cure( AidKit *)
{
heal->healing(healLevel);
}
void healing()
{
heal->healing(healLevel);
}
int getHealLevel()
{
return healLevel;
}
}
void main()
{
Healer *myHealer = NULL;
AidKit *myKit = NULL;
AdvFighter *healFighter = new AdvFigher( myHealer );
healFighter->cFighter();
healFighter->cure(myKit);
healFighter->healing();
healFighter->attack();
delete healFighter;
}
2. 클래스 어댑터 패턴 Class Adapter Pattern
이 타입의 어댑터는 목표를 달성하기 위해 여러개의 다형성 인터페이스( ploymorphic interfaces)를 사용 한다. 어댑터는 구현될 예정인 인터페이스나 이미 구현된 인터페이스를 상속 받아서 만들어진다.
구현될 예정인 인터페이스는 순수인터페이스 클래스로 만들어지는 것이 일반적이다.
즉. 다중상속을 사용하여 인터페이스를 변경한다.
오버라이드 할 수 있다.
class AidKit
{
};
class Fighter
{
private:
public:
virtual void cure(AidKit *) = 0;
virtual void attack() = 0;
virtual void defense() = 0;
void myClass(){ cout << "I'm Fighter" << endl; }
};
class Healer
{
public:
void healing( int Level )
{
cout << "Level : " << Level << "Healing 시전" << endl;
}
void magic_attack();
void magic_defense();
};
class AdvFighter : public Fighter, private Healer
{
private:
int healLevel;
public:
AdvFighter()
{
healLevel = 1;
}
void cure(AidKit *)
{
Healer::healing(healLevel);
}
void attack(){}
void defense(){}
};
void main()
{
AdvFighter *myFighter = new AdvFighter;
AidKit *myKit = NULL;
myFighter->myClass();
myFighter->cure(myKit);
delete myFighter;
}
- Filed under : 디자인 패턴/1. 적응자( Adapter )