디자인 모드 어댑터 모드 (카드 다음날)
7335 단어 디자인 모드
오늘 은 다음 날, 디자인 모델 을 복습 하고 버 티 려 는 다음 날 입 니 다.
어댑터 모드
1. 어댑터 모드 란 무엇 인가
어댑터 모드 (Adapter Pattern): 하나의 인 터 페 이 스 를 고객 이 원 하 는 다른 인터페이스 로 변환 하여 인터페이스 가 호 환 되 지 않 는 클래스 를 함께 작업 할 수 있 도록 합 니 다. 별명 은 포장 기 (Wrapper) 입 니 다.어댑터 모드 는 클래스 구조 형 모드 일 수도 있 고 대상 구조 형 모드 일 수도 있다.
어댑터 모드 에서 우 리 는 새로운 어댑터 류 를 추가 하여 인터페이스 가 호 환 되 지 않 는 문 제 를 해결 하여 원래 아무런 관계 가 없 었 던 클래스 가 협동 작업 을 할 수 있 도록 합 니 다.
2. 어댑터 분류
어댑터 류 와 어댑터 류 의 관계 에 따라 어댑터 모드 는 대상 어댑터 와 클래스 어댑터 두 가지 로 나 눌 수 있 으 며 대상 어댑터 모드 에서 어댑터 와 어댑터 간 은 관련 관계 이다.클래스 어댑터 모드 에서 어댑터 와 어댑터 간 은 계승 (또는 실현) 관계 (디자인 모델 은 계승 실현 의 교묘 한 응용 이 아 닙 니까?
3. 코드 예시
클래스 어댑터
클래스 어댑터 는 주로 계승 방식 으로 두 개의 인 터 페 이 스 를 연결 합 니 다.우 리 는 인터페이스 A 와 인터페이스 B 를 연결한다 고 가정한다.
/**
* @ClassName Adaptee
* @Author ywj
* @Describe , , Adaptee Target ,
* , , Target Adaptee 。
* @Date 2020/5/21 11:41
*/
public class Adaptee {
public void adapteeRequest() {
System.out.println(" ");
}
}
목표 인터페이스
public interface Target {
void test();
}
어댑터 코드
public class Adapter extends Adaptee implements Target {
@Override
public void test() {
super.adapteeRequest();
}
}
이렇게 해서 두 개의 인 터 페 이 스 를 연결 하 였 으 나, 실제로 이런 표기 법 은 사용 할 수 없고 그다지 유연 하지 않 을 것 이 며, 자바 에 서 는 되도록 계승 을 적 게 사용 하고 조합 을 많이 사용 해 야 한다.쓰기 도 이상 하 다.
대상 어댑터
대상 어댑터 와 클래스 어댑터 가 다른 점 은 클래스 어댑터 는 계승 을 통 해 어댑터 를 완성 하고 대상 어댑터 는 관련 을 통 해 완성 하 는 것 입 니 다. 여기 서 조금 만 수정 하 겠 습 니 다.
Adapter
클래스 는 대상 어댑터 로 바 꿀 수 있 습 니 다.public class Adapter implements Target {
//
private Adaptee adaptee = new Adaptee();
@Override
public void test() {
System.out.println(" test ");
adaptee.adapteeRequest();
}
}
근 데 이런 Adaptee 도 원활 하지 않 고 죽은 것 같 아서 조정 할 수 있어 요.
public class Adapter implements Target {
//
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void test() {
System.out.println(" test ");
adaptee.adapteeRequest();
}
}
이렇게 하면 아까 보다 훨씬 좋아 졌 습 니 다. 아까 코드 보다 훨씬 유연 해 졌 지만 더 좋 을 수 있 습 니 다. 어떻게 하면 더 좋 고 추상 적 으로 나 올 수 있 습 니까? Adaptee 를 추상 적 으로 나 올 수 있 습 니까? 아니면 oop 으로 돌 아 왔 습 니까?
어댑터 모드 에 있어 서 좋 은 예 코드 는 전원 어댑터 를 실현 하 는 것 이다.
우리 나라 의 민용 전 기 는 모두 220 V 이 고 일본 은 110 V 이다. 그러나 우리 의 휴대 전화 충전 은 보통 5V 가 필요 하 다. 이때 충전 하려 면 220 V 또는 100 V 의 입력 전압 을 5V 로 바 꾸 어 수출 하 는 전압 어댑터 가 필요 하 다.
출력 교류 인터페이스 정의
public interface AC {
int outputAc();
}
public class AC110V implements AC {
@Override
public int outputAc() {
return 110;
}
}
public class AC220V implements AC{
@Override
public int outputAc() {
return 220;
}
}
어댑터 인터페이스
support()
방법 은 입력 한 전압 이 어댑터 와 일치 하 는 지 검사 하 는 데 사용 된다. outputDC5V()
방법 은 입력 한 전압 을 5V 로 변환 한 후 출력 하 는 데 쓰 인 다public interface DC5VAdapter {
/**
*
*
* @param ac
* @return
*/
boolean support(AC ac);
/**
*
*
* @param ac
* @return
*/
int outPutDc5V(AC ac);
}
110 v 220 v 어댑터 구현
public class JapanPowerAdapter implements DC5VAdapter {
public static final int voltage = 110;
@Override
public boolean support(AC ac) {
if(voltage==ac.outputAc()){
return true;
}
return false;
}
@Override
public int outPutDc5V(AC ac) {
int i = ac.outputAc();
int out=i/22;
System.out.println(" 110V AC "+i+"V"+" DC "+out+"V");
return out;
}
}
public class ChinaPowerAdapter implements DC5VAdapter {
public static final int voltage = 220;
@Override
public boolean support(AC ac) {
if (ac.outputAc() == voltage) {
return true;
}
return false;
}
@Override
public int outPutDc5V(AC ac) {
int outputAc = ac.outputAc();
int out = outputAc / 44;
System.out.println(" 220V AC " + outputAc + "V DC "+out+"V");
return out;
}
}
테스트 클래스
private List adapters = new ArrayList();
public Test() {
this.adapters.add(new ChinaPowerAdapter());
this.adapters.add(new JapanPowerAdapter());
}
//
public DC5VAdapter getPowerAdapter(AC ac) {
DC5VAdapter adapter = null;
for (DC5VAdapter ad : this.adapters) {
if (ad.support(ac)) {
adapter = ad;
break;
}
}
if (adapter == null) {
throw new IllegalArgumentException(" ");
}
return adapter;
}
public static void main(String[] args) {
Test test = new Test();
AC ac = new AC220V();
DC5VAdapter powerAdapter = test.getPowerAdapter(ac);
powerAdapter.outPutDc5V(ac);
}
이 코드 는 포인트 가 아니 라 어떻게 쓰 는 지 아 는 게 포인트 예요.
어댑터 모드 요약
주요 장점:
목표 클래스 와 어댑터 클래스 를 결합 시 키 고 어댑터 클래스 를 도입 하여 기 존의 어댑터 클래스 를 다시 사용 하 며 기 존의 구 조 를 수정 할 필요 가 없습니다.클래스 의 투명 성과 복용 성 을 증가 시 켰 고 구체 적 인 업무 실현 과정 을 어댑터 클래스 에 봉 하여 클 라 이언 트 클래스 에 있어 투명 하고 어댑터 의 복용 성 을 향상 시 켰 다. 같은 어댑터 클래스 는 여러 개의 서로 다른 시스템 에서 복용 할 수 있다.유연성 과 확장 성 이 매우 좋 습 니 다. 설정 파일 을 사용 하면 어댑터 를 편리 하 게 교체 할 수 있 고 기 존 코드 를 수정 하지 않 은 토대 에서 새로운 어댑터 류 를 추가 할 수 있 으 며 '개폐 원칙' 에 완전히 부합 합 니 다.
구체 적 으로 보면 클래스 어댑터 모델 은 다음 과 같은 장점 이 있다.
어댑터 류 는 어댑터 류 의 하위 클래스 이기 때문에 어댑터 류 에서 어댑터 의 방법 을 교체 하여 어댑터 의 유연성 을 더욱 강하 게 할 수 있다.대상 어댑터 모드 는 다음 과 같은 장점 이 있 습 니 다.
하나의 대상 어댑터 는 여러 개의 서로 다른 어댑터 를 같은 목표 에 맞 출 수 있다.어댑터 와 어댑터 간 은 관련 관계 이기 때문에 '리 씨 교체 원칙' 에 따라 어댑터 의 하위 클래스 도 이 어댑터 를 통 해 적합 하 게 배합 할 수 있다.
클래스 어댑터 모드 의 단점 은 다음 과 같 습 니 다.
자바, C \ # 등 다 중 클래스 계승 을 지원 하지 않 는 언어 에 대해 서 는 한 번 에 한 개의 어댑터 클래스 만 맞 출 수 있 고 여러 개의 어댑터 를 동시에 맞 출 수 없습니다.어댑터 클래스 는 최종 클래스 가 될 수 없습니다. 예 를 들 어 자바 에서 final 클래스 가 될 수 없고 C \ # 에서 sealed 클래스 가 될 수 없습니다.자바, C \ # 등 언어 에서 클래스 어댑터 모드 의 목표 추상 류 는 인터페이스 일 뿐 클래스 일 수 없고 사용 에 한계 가 있다.대상 어댑터 모드 의 단점 은 다음 과 같 습 니 다.
클래스 어댑터 모드 에 비해 어댑터 에서 어댑터 클래스 를 바 꾸 는 방법 은 비교적 번거롭다.만약 에 반드시 적임자 류 의 하나 또는 여러 가지 방법 을 바 꾸 려 면 먼저 적임자 류 의 자 류 를 만 들 고 적임자 류 의 방법 을 바 꾼 다음 에 적임자 류 의 자 류 를 진정한 적임자 로 적당 하 게 배합 하여 실현 과정 이 비교적 복잡 하 다.
어댑터 응용 필드
1. 우 리 는 제3자 의 라 이브 러 리 를 사용 하거나 제3자 의 API 를 사용 할 때 어댑터 전환 을 통 해 기 존 시스템 의 사용 수 요 를 만족 시 킵 니 다.
2. 우리 의 낡은 시스템 과 새로운 시스템 이 통합 되 었 을 때 우 리 는 낡은 시스템 의 데이터 가 새로운 시스템 의 수 요 를 만족 시 키 지 못 한 다 는 것 을 발견 했다. 그러면 이때 우 리 는 어댑터 가 필요 하고 호출 수 요 를 완성 해 야 할 수도 있다.
3. 우 리 는 서로 다른 데이터 베 이 스 를 사용 하여 데 이 터 를 동기 화 합 니 다.(저 는 프로그램 을 통 해 실 현 될 때의 상황 을 분석 할 뿐 입 니 다. 그리고 다른 여러 가지 방식 [데이터 베이스 동기 화] 도 있 습 니 다.
4. 시스템 은 기 존의 클래스 를 사용 해 야 하 는데 이런 종류의 인터페이스 (예 를 들 어 방법 명) 는 시스템 의 수요 에 부합 되 지 않 고 심지어 이런 종류의 소스 코드 도 없다.
5. 중복 사용 할 수 있 는 클래스 를 만 들 고 싶 습 니 다. 서로 에 게 큰 관련 이 없 는 클래스 를 만 들 고 싶 습 니 다. 앞으로 도 입 될 수 있 는 클래스 와 함께 일 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.