클래스의 인터페이스를 사용자가 원하는 인터페이스의 평태로 가공하는 패턴
객체 지향에는 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() 함수를 그대로 사용할 수 있게 되었다.