디자인 모드 (6) - 어댑터 모드

콘 셉 트
어댑터 모드 (Adapter Pattern) 는 호 환 되 지 않 는 인터페이스 사이 의 다리 입 니 다.이 디자인 모델 은 구조 형 모델 로 두 개의 독립 인터페이스 기능 을 결합 시 켰 다.그 별명 은 포장 기 (Wrapper) 모델 로 유형 구조 형 모델 로 도 할 수 있 고 대상 구조 형 모델 로 도 할 수 있다.어댑터 모드 에서 언급 된 인 터 페 이 스 는 넓 은 의미 의 인 터 페 이 스 를 가리 키 며 하나의 방법 이나 방법의 집합 을 나 타 낼 수 있다.이런 모델 은 하나의 단일 클래스 (어댑터 클래스) 와 관련 되 는데 이 클래스 는 독립 적 이거 나 호 환 되 지 않 는 인 터 페 이 스 를 통합 하 는 기능 을 담당한다.인 스 턴 스: 가정용 콘 센트 는 220 V 전압 이 고 핸드폰 충전 전압 은 5V 이 며 충전 기 는 어댑터 의 역할 을 하여 220 V 전압 을 5V 전압 으로 전환한다.주요 해결: 소프트웨어 시스템 에서 '현존 하 는 대상' 을 새로운 환경 에 두 어야 하 는데 새로운 환경 이 요구 하 는 기능 은 기 존의 대상 이 만족 하지 못 하 는 것 이다.사용 장면: 정상적으로 실행 되 는 인 터 페 이 스 를 동기 적 으로 수정 합 니 다.시스템 은 기 존의 종 류 를 사용 해 야 하 며, 기 존의 인 터 페 이 스 는 시스템 의 수요 에 완전히 부합 되 지 않 는 다.중복 사용 가능 한 종 류 를 만 들 려 면 서로 에 게 큰 관련 이 없 는 종 류 를 만 들 려 고 합 니 다. 앞으로 도 입 될 수 있 는 종 류 를 포함 하여 함께 일 할 수 있 습 니 다. 이런 소스 류 는 반드시 일치 하 는 인터페이스 가 있 는 것 은 아 닙 니 다.장점: 관련 이 없 는 두 가지 유형 을 함께 운행 시 키 고 유형의 재 활용 을 향상 시 키 며 투명 도 를 증가 하고 유연성 이 좋다.단점: 어댑터 를 너무 많이 사용 하면 시스템 이 매우 복잡 하고 전체적인 통 제 를 하기 어렵다.예 를 들 어 A 인 터 페 이 스 를 보 았 는데 사실은 내부 가 B 인터페이스의 실현 으로 적합 해 졌 다.큰 필요 가 없다 면 어댑터 를 사용 하지 않 고 시스템 을 재 구성 하 는 것 이 좋다.
주: 어댑터 는 상세 한 디자인 에 추 가 된 것 이 아니 라 복무 중인 프로젝트 의 문 제 를 해결 하 는 것 입 니 다.어댑터 모드 는 클래스 의 인 터 페 이 스 를 고객 이 원 하 는 또 다른 인터페이스 로 전환 하 는데 주요 목적 은 호환성 이 고 원래 함께 일 하지 못 했 던 두 가지 유형 이 협동 작업 을 할 수 있 도록 하 는 것 이다.어댑터 모드 는 세 가지 가 있 습 니 다. 클래스 어댑터, 대상 어댑터, 인터페이스 어댑터 입 니 다.
본 논문 의 사례 에서 적당 한 유형, 인터페이스 또는 대상 을 소스 src (source) 라 고 불 러 야 한다.최종 적 으로 필요 한 출력 을 대상 des (destination) 라 고 합 니 다.어댑터 를 어댑터 라 고 합 니 다.한 마디 로 어댑터 모드 는 src – > Adapter – > des, 즉 src 가 특정한 형식 으로 Adapter 에 전달 되 고 최종 적 으로 des 로 전환 되 는 것 입 니 다.어 울 리 는 것 은 '소스' 에서 '목표' 까지 의 어 울 리 는 것 이 고 그 중에서 이들 의 관 계 를 연결 하 는 것 은 바로 어댑터 이다.이 는 '소스' 를 '목표' 로 넘 어가 '소스' 에 없 던 기능 을 실현 하고 '소스' 자체 의 구 조 를 파괴 하지 않 는 다.
다음은 휴대 전화 충전 을 예 로 들 어 세 가지 어댑터 모델 을 소개 한다.
클래스 어댑터 모드
단일 하 게 어떤 종 류 를 위해 적합 한 배합 을 실현 하 다.Adapter 류 는 src 류 를 계승 하여 des 인 터 페 이 스 를 실현 하고 src – > des 의 적합 을 완성 합 니 다.기 존 src 클래스 Voltage 220 V
public class Voltage220V {
	public int out220V() {
		System.out.println("      :220V");
		return 220;
	}
}

원 하 는 des 인터페이스
public interface Voltage5V {
	int out5V();
}

어댑터 클래스 어댑터
public class Adapter extends Voltage220V implements Voltage5V {
	@Override
	public int out5V() {
		int src = out220V();
		//    
		return src/44;
	}
}

클 라 이언 트 클래스 모 바 일
public class Mobile {
	//    , 5V    
	public void charging(Voltage5V voltage5V) {
		System.out.println("      :" + voltage5V.out5V() + "V");
	}
}

테스트 클래스 어댑터 테스트
public class AdapterTest {
	public static void main(String[] args) {
		Mobile mobile = new Mobile();
		mobile.charging(new Adapter());
	}
}

인쇄 결과 콘센트 출력 전압: 220 V 현재 충전 전압: 5V
주의: 자바 라 는 단일 계승 체 제 는 계승 해 야 할 모든 것 을 우선 사용 하 는 것 을 권장 하지 않 습 니 다.분명히 Adapter 류 는 Voltage 220 V 류 를 계승 하면 다른 종 류 를 계승 할 수 없다. 즉, 이 어댑터 는 Voltage 220 V 라 는 서비스 만 있 기 때문에 클래스 어댑터 모델 이 라 고 부른다.클래스 어댑터 는 des 가 인터페이스 여야 하 며 한계 가 있 으 며 src 의 방법 은 Adapter 에서 모두 노출 되 어 사용 원 가 를 증가 시 킵 니 다.그러나 src 류 를 계승 하기 때문에 수요 에 따라 src 중의 방법 을 재 작성 하여 Adapter 의 유연성 을 강화 할 수 있 습 니 다.
대상 어댑터 모드
대상 어댑터 모드 는 '원본' 을 하나의 대상 으로 어댑터 클래스 에 집합 하여 '원본' 을 구조 함수 매개 변수 로 어댑터 에 전송 한 다음 인터페이스 가 요구 하 는 방법 을 실행 하 는 것 입 니 다.이런 모델 은 여러 개의 '소스' 를 적당 하 게 배치 하여 어댑터 모델 의 부족 을 보완 할 수 있다.기본 적 인 해결 방향 은 클래스 어댑터 와 같 습 니 다. Adapter 류 를 약간 수정 하여 src 류 를 계승 하지 못 하 게 하 는 것 이 아니 라 src 류 의 인 스 턴 스 를 가지 고 호환성 문 제 를 해결 합 니 다.즉, src 인 스 턴 스 를 가지 고 des 인 터 페 이 스 를 실현 하고 src – > des 의 적합 을 완성 합 니 다.'합성 복용 원칙' 에 따라 상속 관 계 를 시스템 에서 가능 한 한 연관 관 계 를 사용 하기 때문에 대부분의 구조 형 모델 은 대상 구조 형 모델 이다.
위의 인 스 턴 스 를 바탕 으로 Adapter 류 를 수정 합 니 다.
public class Adapter implements Voltage5V {
	private Voltage220V voltage220V;
	public Adapter(Voltage220V voltage220V) {
		this.voltage220V = voltage220V;
	}
	public int out5V() {
		if (voltage220V != null) {
			int src = voltage220V.out220V();
			//    
			return src/44;
		}
		return 0;
	}
}

테스트 클래스 코드 변경
Adapter adapter = new Adapter(new Voltage220V());
Mobile mobile = new Mobile();
mobile.charging(adapter);

인쇄 결 과 는 콘센트 출력 전압: 220 V 현재 충전 전압: 5V
주: 대상 어댑터 와 클래스 어댑터 는 사실 같은 사상 이 고 실현 방식 이 다 를 뿐 입 니 다.합성 복용 원칙 에 따라 조합 이 계승 보다 크기 때문에 클래스 어댑터 가 반드시 src 를 계승 해 야 하 는 한계 문 제 를 해 결 했 고 des 가 반드시 인터페이스 여야 한다 고 강요 하지 않 았 다.마찬가지 로 대상 어댑터 의 사용 원가 가 낮 고 유연 하 다.클래스 어댑터 모델 은 단일 소스 의 어댑터 에 사용 되 는데 소스 가 단일 하기 때문에 코드 의 실현 은 선택 논 리 를 쓰 지 않 아 도 되 고 구조 가 비교적 뚜렷 하 다.한편, 대상 의 어댑터 모델 은 다 원 화 된 어댑터 모델 에 사용 할 수 있 고 유형 어댑터 모델 의 부족 을 보완 할 수 있 으 나 소스 의 데이터 가 많 을 수 있 기 때문에 구체 적 으로 실현 하 는 분기 가 많 고 구조 가 뚜렷 하지 않다.
장식 기 모델 과 차이 점 은 장식 자 는 src 에 대한 장식 이 고 사용자 가 src 의 장식 에 대해 전혀 느끼 지 못 한 다 는 것 이다 (사용자 의 용법 은 변 하지 않 는 다).이곳 의 대상 이 적합 한 후에 사용자 의 용법 이 바 뀔 것 이다.
인터페이스 어댑터 모드
인터페이스 어댑터 모드 는 기본 어댑터 모드 나 부족 어댑터 모드 라 고도 불 린 다.하나의 인 터 페 이 스 를 실현 하 는 동시에 인터페이스의 모든 방법 을 실현 하고 싶 지 않 고 일부 방법 만 실현 하고 싶 을 때 인터페이스 어댑터 모드 를 사용한다.이러한 모델 은 인터페이스 와 구체 적 인 실현 류 사이 에 추상 류 를 추가 하고 추상 류 로 이 인터페이스의 모든 방법 에 기본 적 인 실현 (빈 방법) 을 제공 하 며 구체 적 인 실현 류 (추상 류 의 하위 클래스) 는 완성 해 야 할 방법 만 다시 쓰 면 된다. 하나의 인터페이스 에 있 는 모든 방법 을 사용 하지 않 으 려 는 상황 에 적용 된다.예제 코드 src 인터페이스
public interface Source {
	public abstract void A();
	public abstract void B();
	public abstract void C();
	public abstract void D();
	public abstract void E();
	public abstract void F();
}

추상 클래스 (어댑터)
public abstract class Adapter implements Source {
	public void A() {}
	public void B() {}
	public void C() {}
	public void D() {}
	public void E() {}
	public void F() {}
}

최종 실현 클래스
public class Destination extends Adapter {
	//    A
	@Override
	public void A() {
		System.out.println("A  。。。");
	}
	//    E
	@Override
	public void E() {
		System.out.println("E  。。。");
	}
}

총결산
어댑터 는 어댑터 의 중간 부품 으로 일치 하지 않 는 두 사람 사이 에 존재 하 며, 두 사람 을 연결 하 는 데 사용 되 며, 일치 하지 않 는 것 을 일치 시 킵 니 다.세 가지 명명 방식 은 이렇게 이해 할 수 있다. src 가 어떤 형식 으로 Adapter (Adapter 에서 의 형식) 에 이름 을 붙 인 클래스 어댑터 는 클래스 로, Adapter 에서 src 를 하나의 클래스 로 계승 하 는 지.대상 어댑터, 대상 으로 어댑터 에서 src 를 대상 으로 보유 합 니 다.인터페이스 어댑터, 인터페이스 로 어댑터 에서 src 를 인터페이스 로 구현 (간접 구현).클래스 어댑터 와 대상 어댑터 는 이미 존재 하 는 클래스 를 사용 하려 고 하지만 기 존의 인터페이스 규범 에 부합 되 지 않 아 직접 접근 할 수 없고 어댑터 를 만 들 면 인터페이스 에 간접 적 으로 접근 할 수 있 는 방법 입 니 다.접근 하 는 방법 은 적당 한 인터페이스 에 없습니다.통 일 된 출력 인터페이스 가 필요 하지만 입력 단자 유형 은 예측 할 수 없습니다.인터페이스 어댑터 는 인터페이스의 일부 방법 을 사용 하려 고 하지만 인터페이스 에 너무 많은 방법 이 있 기 때문에 사용 할 때 인 터 페 이 스 를 실현 하고 인터페이스의 모든 방법 을 실현 해 야 한다.이 때 는 먼저 추상 류 로 이 인 터 페 이 스 를 실현 하고 이 인터페이스 에서 의 방법 (실현 방법 을 비 워 두 는 것) 을 실현 하지 않 은 다음 에 이 추상 류 를 계승 하여 사용 하고 자 하 는 방법 을 다시 쓸 수 있다. 이 추상 류 는 바로 어댑터 이다.

좋은 웹페이지 즐겨찾기