Search Results for '디자인 패턴/1. 적응자( Adapter )'

1 POSTS

  1. 2012.10.22 적응자( Adapter )

적응자( Adapter )

Posted 2012. 10. 22. 17:41
한 클래스의 인터페이스를 호환 가능한 가른 인터페이스로 변환시키는 디자인 패턴.


사용예)
1. 기존의 클래스를 재사용 하고 싶지만 인터페이스가 맞지 않을때
2. 인터페이스가 다른 클래스들을 묶어서 함께 동작하도록 하고 싶을때
3. 인터페이스가 다른 클래스와 그 서브 클래스들을 모두 재사용하고 싶을 때



적응자 패턴엔 두가지 종류가 있다.

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;

}