Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

디자인패턴 Adapter pattern 본문

디자인패턴

디자인패턴 Adapter pattern

개발자가되고싶어 2021. 9. 2. 16:19
Adapter pattern

 

어댑터 패턴이란?

용도는 비슷하게 사용되지만 서로 다른 interface를 구현한다면 같이 사용할 수 없다.

이러한 호환성 문제를 해결하기 위해 어댑터 패턴을 이용한다.

 

- 예시

우리는 모니터를 본체와 연결할때 dvi 케이블과 hdmi 케이블을 사용할 수 있다.

하지만 내 모니터는 hdmi만을 연결할 수 있고 나는 dvi 케이블만을 가지고있다.

이를 해결하기위해 dvi를 hdmi로 연결하기 위한 adapter가 필요하다.

 

 

코드를 한번 봅시다.

 

DVI

public interface Dvi {
    void insertDviSlot();
    void printScreen();
}

public class SamsungDvi implements Dvi {
    @Override
    public void insertDviSlot() {
        System.out.println("insertDvi");
    }

    @Override
    public void printScreen() {
        System.out.println("printScreen");
    }
}

HDMI

public interface Hdmi {
    void insertHdmiSlot();
    void printScreen();
}

public class LgHdmi implements Hdmi {
    @Override
    public void insertHdmiSlot() {
        System.out.println("insertHdmi");
    }

    @Override
    public void printScreen() {
        System.out.println("printScreen");
    }
}

현재 client는 가지고있는 Dvi interface를 구현한 dvi 케이블만 있습니다. 그렇기에 현재 client는 Hdmi가 필요한 모니터를 사용할 수 없는 상황입니다.

 

현재는 단순히 client가 Dvi interface에 의존하고 있으며 Hdmi를 사용할 수 없는 상황입니다.

 

Monitor

public class Monitor {
    private Hdmi hdmi;

    public Monitor(Hdmi hdmi) {
        this.hdmi = hdmi;
    }

    public void printScreen() {
        hdmi.printScreen();
    }
}

우리가 연결해서 사용할 모니터 입니다. hdmi 케이블밖에는 지원하지 않습니다.

 

Adapter

public class DviAdapter implements Hdmi {
    Dvi dvi;
    public DviAdapter(Dvi dvi) {
        this.dvi = dvi;
    }

    @Override
    public void insertHdmiSlot() {
        dvi.insertDviSlot();
    }

    @Override
    public void printScreen() {
        dvi.printScreen();
    }
}

client가 필요한것은 Hdmi 케이블입니다. 우리는 Hdmi interface를 구현한 Adapter를 만들어주면 됩니다.

이젠 Hdmi 만을 지원하는 모니터를 사용할 준비가 끝났습니다.

 

Client

public class Client {

    public static void main(String[] args) {
        DviAdapter adapter = new DviAdapter(new SamsungDvi());
        Monitor monitor = new Monitor(adapter);
        monitor.printScreen();
    }
}

client는 이제 dvi 케이블을 어댑터를 사용하여 moniter를 사용할 수 있게 되었습니다.

 

장점

  • 사용하려는 코드를 수정하지 않고 달성하려는 목적의 interface에 호환되게 만들 수 있다.
  • 기존 코드를 변경하지 않고 목적에 맞게 호환시킬 수 있기 때문에 재활용성에서 좋아진다.

 

단점

  • 코드 복잡성 증가
  • 구현하려는 목적의 interface의 내용을 모두 구현해야한다