디자인 모드 어댑터 모드 (카드 다음날)

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. 중복 사용 할 수 있 는 클래스 를 만 들 고 싶 습 니 다. 서로 에 게 큰 관련 이 없 는 클래스 를 만 들 고 싶 습 니 다. 앞으로 도 입 될 수 있 는 클래스 와 함께 일 할 수 있 습 니 다.
 

좋은 웹페이지 즐겨찾기