> Java > java지도 시간 > Java의 어댑터 패턴(Adapter)이란 무엇입니까? 어댑터 패턴(자세한 설명)

Java의 어댑터 패턴(Adapter)이란 무엇입니까? 어댑터 패턴(자세한 설명)

青灯夜游
풀어 주다: 2018-10-18 16:14:19
앞으로
8387명이 탐색했습니다.

이 기사에서 제공하는 내용은 Java의 어댑터 패턴(Adapter)이 무엇인지입니다. 어댑터 패턴(자세한 설명) 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

목적: 클라이언트의 요구에 맞게 소스 유형을 대상 유형에 맞게 조정합니다. 여기서는 대상 인터페이스의 호출자를 클라이언트로 간주합니다.

사용 시나리오: 필요 소스 유형에서 대상 유형으로의 유형 변환

전제 조건: 기존 클라이언트

//Client 一个调用目标接口的方法
Class ClientInvoking {

    static void invoke(TargetInterface target) {
        String value = target.getMark();
        System.out.println(value);
    }

}
로그인 후 복사

일반적으로 사용되는 여러 모드

모드 1: 대상 인터페이스가 존재하며 기존 메소드가 있습니다

//目标接口
public interface TargetInterface {
    
    public String getMark();

    public String getInfo();

}
로그인 후 복사
//已有类及方法
public class ExistClass {

    public String sayHello() {
        return "Hello";
    }
      
    public String sayWorld() {
        return "World";
    }
}
로그인 후 복사
로그인 후 복사

ExistClass가 반환한 문자열이 클라이언트가 사용해야 하는 문자열이라고 가정하지만 클라이언트가 필요로 하는 것은 TargetInterface 유형 개체를 통해 문자열을 얻는 것이므로 기존 클래스를 조정할 수 있는 방법을 찾아야 합니다. 클라이언트의 요구를 충족합니다. 이 모드에는 두 가지 애플리케이션 솔루션이 있습니다.

구성표 1. 클래스 어댑터 모드

//适配器
public class ClassAdapter extends ExistClass implements TargetInterface {
    
    public int getMark() {
        String value = this.sayHello();
        return value;
    }
    
    public int getInfo() {
        String value = this.sayWorld();
        return value;
    }
    
}
로그인 후 복사
//客户端调用
TargetInterface target = new ClassAdapter();
ClientInvoking.invoke(target);
로그인 후 복사

Java 인터페이스 개념에서 ClassAdapter가 TargetInterface의 구현 클래스임을 알 수 있습니다. 클라이언트의 요구에 맞게 위쪽으로 TargetInterface 유형으로 변환됩니다.

솔루션 2. 개체 어댑터 패턴

//适配器
public class ClassAdapter implements TargetInterface {
    
    private ExistClass exist;
    
    public ClassAdapter(ExistClass existClass) {
        this.exist = existClass;
    }
    
    public int getMark() {
        String value = exist.sayHello();
        return value;
    }
    
    public int getInfo() {
        String value = exist.sayWorld();
        return value;
    }
    
}
로그인 후 복사
//客户端调用
TargetInterface target = new ClassAdapter(new ExistClass());
ClientInvoking.invoke(target);
로그인 후 복사

이 솔루션은 클래스 어댑터 패턴과 유사하지만 상속을 사용하지 않고 보다 유연하고 확장 가능한 개체 보유 방법을 사용한다는 점만 다릅니다.

모드 2: 대상 인터페이스는 없지만 대상 클래스가 있고 기존 메소드가 있습니다.

먼저 전제 조건에서 다음과 같이 클라이언트를 변환합니다.

Class ClientInvoking {

    static void invoke(TargetClass target) {
        String value = target.getMark();
        System.out.println(value);
    }

}
로그인 후 복사

변환 후 호출 이 메소드에는 TargetClass 클래스의 객체가 매개변수로 필요합니다. 다음은 대상 클래스와 기존 클래스입니다. 클라이언트의 콘텐츠가 오래되었으므로 클라이언트의 요구 사항에 맞게 ExistClass를 조정할 방법을 찾아야 합니다.

//目标类
public class Class {
    
    public String getMark() {
        return "yes";
    }

    public String getInfo() {
        return "no";
    }

}
로그인 후 복사
//已有类及方法
public class ExistClass {

    public String sayHello() {
        return "Hello";
    }
      
    public String sayWorld() {
        return "World";
    }
}
로그인 후 복사
로그인 후 복사

이 모드에서는 두 개의 클래스가 설계되고 마지막으로 Java의 단일 코드에 따라 상향 변환이 수행됩니다. 상속 메커니즘에서는 객체를 보유하는 형태, 즉 객체 어댑터 패턴으로만 전달할 수 있습니다.

모드 3: 기본 어댑터 모드

이 모드에는 명시적인 대상 유형이 없고 소스 유형만 필요한 이유는 소스 유형이 너무 많은 것을 제공하기 때문입니다. 필요하지 않으므로 어댑터 패턴을 통해 사용자 정의해야 합니다. WindowListener를 예로 들어 설명하겠습니다.

//适配器
public class ClassAdapter extends TargetClass {
    
    private ExistClass exist;
    
    public ClassAdapter(ExistClass existClass) {
        this.exist = existClass;
    }
    
    public int getMark() {
        String value = exist.sayHello();
        return value;
    }
    
    public int getInfo() {
        String value = exist.sayWorld();
        return value;
    }
    
}
로그인 후 복사
//客户端调用
TargetClass target = new ClassAdapter(new ExistClass());
ClientInvoking.invoke(target);
로그인 후 복사

이와 같은 코드는 매우 번거로워 보입니다. 예를 들어 종료 이벤트만 수신하면 되지만 관련 없는 템플릿 코드가 많이 생성되어 코드의 가독성이 떨어집니다. . 이를 고려하여 이를 사용자 정의하고 하나의 인터페이스만 들어보겠습니다.

먼저 인터페이스를 구현하기 위한 추상 클래스를 제공하고 모든 리스너에 대해 빈 구현을 제공한 다음 추상 클래스의 하위 클래스를 사용하여 창을 다시 작성합니다. 닫힌 리스너의 구현인 코드는 다음과 같습니다.

//WindowListener源码
public interface WindowListener extends EventListener {
    public void windowOpened(WindowEvent e);
    public void windowClosing(WindowEvent e);
    public void windowClosed(WindowEvent e);
    ...
}
로그인 후 복사
//添加监听器的例子
Frame frame = new Frame();
frame.addWindowListener(new WindowListener() {
    @Override    
    public void windowOpened(WindowEvent e) {
            
    }

    @Override    
    public void windowClosing(WindowEvent e) {

    }

    @Override    
    public void windowClosed(WindowEvent e) {

    }
    ...
})
로그인 후 복사
//适配器
public abstract ListenerAdapter implements WindowListener {
    public void windowOpened(WindowEvent e) {}
    public void windowClosing(WindowEvent e) {}
    public void windowClosed(WindowEvent e) {}
    ...
}
로그인 후 복사

이 방법은 인터페이스를 단순화하고 코드의 가독성을 향상시킵니다. 가장 중요한 것은 인터페이스의 사용자 정의를 실현했으며 우리가 관심 있는 작업만 수행할 수 있다는 것입니다.

요약: 위 내용이 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다. 더 많은 관련 튜토리얼을 보려면 Java 비디오 튜토리얼,

Java 개발 그래픽 튜토리얼

, bootstrap 비디오 튜토리얼을 방문하세요!

위 내용은 Java의 어댑터 패턴(Adapter)이란 무엇입니까? 어댑터 패턴(자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿