적응자 패턴(Adapter Pattern)
디자인패턴 공부하기
  • JavaScript

적응자 패턴(Adapter Pattern)

클래스의 인터페이스를 사용자가 원하는 인터페이스의 평태로 가공하는 패턴

좀 더 쉽게..

객체 지향에는 toString이라는 함수가 있다. 꼭 그런것은 아니지만, 일반적으로 toString은 객체를 string으로 표현하는 메소드이다.

하지만 나는 toString이 아닌 print를 통해 toString과 동일한 기능을 interface에 정의하고자 한다.

아래의 예제 코드를 살펴보자

class ClassItem {
  print () {
    throw 'This function must be overridden!!';
  }
}

class Box extends ClassItem {
  print() {
    console.log('This is box!!');
  }
}

class Desktop extends ClassItem {
  print() {
    console.log('This is desktop!!');
  }
}

class Test {
  run () {
    const arr = [new Box(), new Desktop()];
    for (const item of arr) {
      item.print();
    }
  }

  /*
    This is box!!
    This is desktop!!
  */
}

2개의 클래스를 배열로 만들어 print를 출력하도록 하였다.

이렇게 깔끔한 코드만 있으면 좋겠지만.. 아쉽게도 우리 회사에는 5년전에 개발된 Mouse라는 클래스가 있었다. 그리고 이 mouse 클래스에는 print대신 write라는 메소드가 있다.

class Mouse {
  write() {
    console.log('This is mouse!!');
  }
}

write의 메소드명을 print로 바꾸면 되겠지만, 이제 오래전 개발되어 사용하는곳이 너무나 많아 모두 수정하기에는 부담스럽다.

이런 경우 어떻게 해야할까?

인터페이스의 확장

calss MouseAdapter extends (Mouse, ClassItem) {
  print() {
    this.write();
  }
}

실제로 javascript에서는 다중 상속을 지원하지 않는다. 본 코드는 예제로만 보시길 권합니다. (서드파티 라이브러리를 이용하면 멀티 상속이 가능하긴 합니다.)

이렇게 MouseAdapter를 선언하였다.

class Test {
  run () {
    const arr = [new Box(), new Desktop(), new MouseAdapter()];
    for (const item of arr) {
      item.print();
    }
  }

  /*
    This is box!!
    This is desktop!!
    This is mouse!!
  */
}

print() 함수를 그대로 사용할 수 있게 되었다.