[pattern] Adapter Pattern

Adapter Pattern

약간의 차이가 있는 클래스들을 인터페이스를 통해 똑같은 기능으로 사용하는 방법

코드

public static void main(String[] args) {
    MyEngine engine = new MyEngine();

    engine.add(1);
    engine.add(2);
    engine.add(3);
    engine.printAll();
    engine.delete(1);
    engine.printAll();
    engine.print(1);
    engine.printAll();
}
public static void main(String[] args) {
    AEngine aEngine = new AEngine();

    engine.add(1);
    engine.add(2);
    engine.add(3);
    for (int i = 0; i < engine.getSize(); i++) {
        engine.print(i);
    }
    System.out.println();
    engine.delete(1);
    for (int i = 0; i < engine.getSize(); i++) {
        engine.print(i);
    }
    System.out.println();
    engine.print(1);
    for (int i = 0; i < engine.getSize(); i++) {
        engine.print(i);
    }
    System.out.println();
}
  • 기존에 사용하던 엔진에서 다른 엔진을 사용하려면 그에 맞게 코드를 수정할 필요가 있을것이다.
  • 이대로라면 유지보수가 불편해질것이다.

  • 그래서 다음과 같이 인터페이스를 만들고 그것을 구현한다.
interface EngineInterface {
    public void print(int index);
    public void printAll();
    public void add(int data);
    public void delete(int index);
    public int getSize();
}

class AdapterEngine implements EngineInterface {
    AEngine engine;

    public AdapterEngine(AEngine engine) {
        this.engine = engine;
    }

    @Override
    public void print(int index) {
        engine.print(index);
    }

    @Override
    public void printAll() {
        for (int i = 0; i < engine.getSize(); i++) {
            engine.print(i);
        }
        System.out.println();
    }

    @Override
    public void add(int data) {
        engine.add(data);
    }

    @Override
    public void delete(int index) {
        engine.delete(index);
    }

    @Override
    public int getSize() {
        return engine.getSize();
    }
}
  • 두 클래스가 제공하는 모든 기능이 들어있음을 알 수 있다.

  • 결과적으론 다음과 같이 변경되지 않은 코드를 사용할 수 있다.

public static void main(String [] args) {
    AEngine aEngine = new AEngine();
    EngineInterface engine = new AdapterEngine(aEngine);

    engine.add(1);
    engine.add(2);
    engine.add(3);
    engine.printAll();
    engine.delete(1);
    engine.printAll();
    engine.print(1);
    engine.printAll();
}