Java 디자인 모드 - 어댑터 모드

3559 단어

정의


모두 두 종류의 어댑터 모드가 있다


대상 어댑터 모드는 이 어댑터 모드에서 어댑터가 패키지의 종류를 수용하는 실례입니다.이런 상황에서 어댑터는 소포 대상을 호출하는 방법을 사용한다.
클래스 어댑터 모드, 이런 어댑터 모드에서 어댑터는 자신이 실현한 클래스를 계승합니다.

해석


하나의 종류의 인터페이스를 고객이 원하는 다른 인터페이스로 바꾸다.어댑터 모드에서는 인터페이스가 호환되지 않아 함께 작업을 할 수 없었던 클래스가 함께 작업을 할 수 있습니다.Gang of Four

기본 개념


고객: 저희 코드를 호출할 대상이 필요합니다.어댑터 모델의 취지: 기존 클래스가 제공하는 서비스를 보존하고 고객에게 인터페이스를 제공하여 고객의 기대를 만족시킨다.

주요 내용


(1) 클래스 어댑터는 고객이 인터페이스에서 원하는 행동을 정의할 때 어댑터 모델을 응용하여 이 인터페이스를 실현하는 클래스를 제공하고 기존의 클래스를 확장하여 하위 클래스를 만들어서 어댑터를 만들 수 있다.
(2) 대상 어댑터 대상 어댑터는 조합을 통해'사용자 기대 인터페이스'를 충족시키는 것 외에 코드 간의 불량 결합도 낮춘다.작업 중에는 객체 어울림을 추천합니다.다음은 객체 어댑터의 UML 그림입니다.
(3) 부족한 어댑터 모델 부족한 어댑터 모델은 특수한 어댑터 모델이지만 이 어댑터는 하나의 추상 클래스에 의해 실현되고 추상 클래스에서 목표 인터페이스에 규정된 모든 방법을 실현해야 하지만 많은 방법의 실현은'평범한'실현이다. 즉, 이런 방법은 모두 빈 방법이다.구체적인 자류는 모두 이 추상류를 계승해야 한다.

3. 코드 예시(Java 디자인 모드의 어댑터 모드와 응용 장면에서 나온 것)


인터페이스 정의


USB.java
public interface USB {
   void isUsb();
}

PS2.java
public interface PS2 {
    void isPS2();
}

목표 클래스

public class Usber implements USB {
    @Override
    public void isUsb() {
        System.out.println("USB ");
    }
}

1. 클래스 어댑터


상속을 통해 적합한 기능 제공
Adapter1.java
public class Adapter1 extends Usber implements PS2 {
    @Override
    public void isPS2() {
        isUsb();
    }
}

테스트 클래스 Test.java
public class Test {

    public static void main(String[] args) {
        PS2 ps2 = new Adapter1();
        System.out.print("PS2 , :");
        ps2.isPS2();
    }
}

출력 결과 PS2 커넥터 적합, 출력: USB 커넥터

2. 객체 어댑터


조합을 통해 적합한 기능 제공
Adapter2.java
public class Adapter2 implements PS2{

    private USB usb;

    public Adapter2(USB usb) {
        this.usb = usb;
    }

    @Override
    public void isPS2() {
        usb.isUsb();
    }
}

테스트 클래스 Test.java
public class Test {

    public static void main(String[] args) {
        PS2 ps2_1 = new Adapter2(new Usber());
        System.out.print("PS2 , :");
        ps2_1.isPS2();
    }
}

출력 결과 PS2 커넥터 적합, 출력: USB 커넥터

3. 기본 어댑터


장면 1. 인터페이스에서 실현해야 할 모든 방법을 규정했다. 그러나 이 인터페이스를 실현해야 하는 구체적인 유형은 그 중의 몇 가지 방법만 사용했고 다른 방법은 모두 소용이 없었다.
만약 우리가 인터페이스 Funcs를 가지고 있다면, 그 중에서 N 여러 방법을 정의할 것이다
public interface Funcs {
    void a();
    void b();
    void c();
    void d();
    void e();
    void f();
}

그러나 실현 클래스는 일부 방법(a(), f() 방법이 필요하다고 가정)만 실현하면 된다. 이때 우리는 중간 클래스를 정의하여 인터페이스Funcs를 실현할 수 있다.
public abstract class Adapter3 implements Funcs {
    @Override
    public void a() {

    }

    @Override
    public void b() {

    }

    @Override
    public void c() {

    }

    @Override
    public void d() {

    }

    @Override
    public void e() {

    }

    @Override
    public void f() {

    }
}

구현 클래스는 이 Adapter 3 클래스를 상속하고 원하는 방법을 선택하여 구현하면 됩니다.
public class MyClass extends Adapter3 {

    @Override
    public void a() {
        super.a();
        // 
    }

    @Override
    public void f() {
        super.f();
        // 
    }

}

테스트 클래스
public class Test {
    public static void main(String[] args) {
        Funcs funcs = new MyClass();
        funcs.a();
        funcs.f();
    }
}

좋은 웹페이지 즐겨찾기