작은 디자인 모드 (6) 어댑터 모드

어댑터 (Adapter) 는 포장 기 (Wrapper) 라 고도 부 르 며, 하나의 인 터 페 이 스 를 사용자 가 원 하 는 다른 인터페이스 로 변환 하여 원래 인터페이스 가 호 환 되 지 않 는 클래스 가 함께 작업 할 수 있 도록 합 니 다.
어댑터 는 클래스 어댑터 와 대상 어댑터 로 나 뉘 는데 클래스 어댑터 의 실현 은 다 중 계승 이 필요 하지만 C \ # 는 다 중 계승 을 지원 하지 않 기 때문에 본 고 는 대상 어댑터 만 논의 하고 자 한다.
만약 에 우리 의 게임 에 두 가지 종류 가 있다 고 가정 하면 식물 과 동물, 식물 은 채집 할 수 있 고 동물 의 피 는 공격 을 받 을 수 있다.
정 의 는 다음 과 같 습 니 다.
public class Plant
{
	public virtual void BeCollected()
	{
		Console.WriteLine ("Drop seeds");
	}
}

public class Animal
{
	public int hp { get; private set;}
	public int atk {get; private set;}
	public Animal()
	{
		hp = 100;
		atk = 20;
	}
	public void BeAttacked(Animal attacker)
	{
		if (hp > 0) {
			hp -= attacker.atk;
		} 
		if (hp <= 0) {
			AnimalDead ();
		}
	}
	protected virtual void AnimalDead()
	{
		Console.WriteLine ("Drop meat");
	}
}

사용:
		Plant plant = new Plant ();
		plant.BeCollected ();
		Animal animal = new Animal ();
		Animal attacker = new Animal ();
		while (animal.hp > 0) {
			animal.BeAttacked (attacker);
		}

이때 계획 을 세 웠 습 니 다. 당신 에 게 우 리 는 피 라 니 아 꽃 이 필요 합 니 다. 피 가 있 으 면 공격 을 받 을 수도 있 고 다른 사람 을 공격 할 수도 있 지만 죽 으 면 씨앗 이 떨 어 집 니 다.
처음부터 이런 상황 을 고려 하지 않 았 기 때문에 Plant 에 hp, atk 속성 과 BeAttacked 방법 을 추가 하 는 것 은 적절 하지 않 을 수 있 습 니 다. 이것 은 Animal 류 의 코드 를 두 번 쓰 는 것 을 의미 하기 때문에 유지 에 불리 합 니 다.Plant 자체 가 다른 종류 에서 물 려 받 을 수도 있 고, 이 경우 에 도 Animal 을 물 려 받 을 수 없다.그리고 이 는 인터페이스 격 리 원칙 과 조합 / 취 합 재 활용 원칙 에 도 위배 된다.
이때 어댑터 모드 를 고려 할 수 있 습 니 다.
public class PiranhaAdapter : Animal
{
	private Plant _plant = new Plant();
	protected override void AnimalDead()
	{
		_plant.BeCollected ();
	}
}

사용:
		PiranhaAdapter piranha = new PiranhaAdapter ();
		while (piranha.hp > 0) {
			piranha.BeAttacked (attacker);
		}

이렇게 하면 식 인 화 문 제 를 잘 해결 한 것 같다.
하지만 어 쩔 수 없 이 어댑터 모드 는 어 쩔 수 없 는 방법 이다.가능 하 다 면 프로그램 설계 초기 에 이러한 문 제 를 고려 하여 더욱 합 리 적 인 계승 관 계 를 작성 하 십시오 (예 를 들 어 Plant 와 Animal 은 모두 Creature 류 에 계승 되 고 Creature 에는 혈 량 과 공 격 력 등 속성 이 포함 되 어 있 으 며 Plant 에는 이 두 값 이 모두 0 입 니 다).또는 프로그램의 완성 도가 높 지 않 을 때 제때에 재 구성 해 야 한다.어 쩔 수 없 는 상황 에서 만 어댑터 모드 를 고려 할 수 있 습 니 다.
어댑터 모드 의 또 다른 용 도 는 외부 API 의 인 터 페 이 스 를 통일 하 는 것 이다.예 를 들 어 작은 말 디자인 모델 (3) 추상 적 인 공장 모델 에서 언급 한 안 드 로 이 드 와 IOS 의 적합 문제 에 대해 안 드 로 이 드 키보드 와 IOSKyboard 처럼 구체 적 으로 인터페이스 전환 을 실현 하 는 유형 은 그 자체 가 어댑터 모델 의 실제 응용 이다.

좋은 웹페이지 즐겨찾기