디자인 패턴 2. Adapter Pattern, 어댑터 패턴

Eddy·2023년 4월 12일
0

Javascript

목록 보기
16/27

디자인패턴

어답터 패턴(Adapter Pattern) 이란?

어댑터 패턴(Adapter Pattern)은 서로 다른 인터페이스를 가지는 두 객체를 연결하여 사용할 수 있도록 하는 구조적인 패턴입니다. 어댑터 패턴을 이용하면, 기존에 작성된 코드를 재사용할 수 있으며, 객체 간의 결합도를 낮출 수 있습니다.

어댑터 패턴은 서로 다른 인터페이스를 가지는 두 객체를 연결하여 사용할 수 있도록 하는 패턴입니다. 어댑터 패턴을 이용하면, 기존 코드를 재사용할 수 있으며, 객체 간의 결합도를 낮출 수 있습니다. 하지만, 어댑터 패턴 적용 시 추가적인 객체 생성이 필요하므로 메모리 사용량이 증가할 수 있으며, 기존 코드를 재사용하지만, 인터페이스를 변환하기 위한 코드가 추가됩니다. 따라서, 어댑터 패턴을 적용할 때에는, 상황에 맞게 적절한 패턴을 선택하여 사용해야 합니다.

어댑터 패턴의 예시로는, 원래 객체와 호환되지 않는 외부 라이브러리나 API를 사용해야 하는 경우가 있습니다. 이런 경우, 어댑터 패턴을 이용하여 기존 코드를 재사용하면서 외부 라이브러리나 API를 사용할 수 있습니다.

또한, 어댑터 패턴은 MVC 디자인 패턴에서도 사용됩니다. MVC 디자인 패턴에서 모델과 뷰 사이에 컨트롤러를 두어 모델과 뷰를 연결합니다. 이때, 어댑터 패턴을 이용하여 모델과 뷰의 인터페이스를 변환하면, 컨트롤러에서 모델과 뷰를 쉽게 연결할 수 있습니다.

어댑터 패턴은 다른 패턴들과 결합하여 사용될 수 있습니다. 예를 들어, 빌더 패턴과 어댑터 패턴을 결합하여, 새로운 객체를 생성하면서 외부 라이브러리나 API와 연결할 수 있습니다. 따라서, 어댑터 패턴은 다른 패턴들과 함께 사용하여 더욱 강력한 솔루션을 제공할 수 있습니다.

어댑터 패턴의 장점

  • 기존 코드를 재사용할 수 있습니다.
  • 객체 간의 결합도를 낮출 수 있습니다.
  • 새로운 코드를 작성하지 않고도 인터페이스를 연결할 수 있습니다.

어댑터 패턴의 단점

  • 어댑터 패턴을 적용하면, 추가적인 객체 생성이 필요하므로 메모리 사용량이 증가할 수 있습니다.
  • 어댑터 패턴을 적용하면, 기존 코드를 재사용하지만, 인터페이스를 변환하기 위한 코드가 추가됩니다.

예시와 이해

JavaScript 클래스 어댑터 패턴(Class Adapter Pattern)

예제 1

class Cat {
	cry() {}
}

class Dog {
	bark() {}	
}

class Kitty extends Cat {
  cry() {
    console.log("meow!");
  }
}

class Nabi extends Cat {
  cry() {
    console.log("meow!");
  }
}

class Happy extends Dog {
  bark() {
    console.log("wang!");
  }
}

kitty.cry() // "meow!"
nabi.cry()  // "meow!"
happy.cry()  // error

class DogAdapter extends Cat {

  constructor(dog) {
    super();
    this.dog = dog;
  }
  
  cry() {
    this.dog.bark();
  }
}

kitty.cry() // "meow!"
nabi.cry()  // "meow!"
new DogAdapter(new Happy()).cry()  // "meow!"

예제 2

// 화씨 온도계(기존에 사용하던 객체)
class FahrenheitSensor {
  getFahrenheitTemp() {
    const temp = Math.floor(Math.random() * 100);
    console.log(`Current temperature is ${temp}°F`);
    return temp;
  }
}
// 섭씨 온도계 (새로운 인터페이스)
class CelsiusSensor {
  getCelsiusTemp() {}
}

// 어댑터 (화씨온도계와 섭씨온도계를 연결해주는 어댑터)
class FahrenheitToCelsiusAdapter extends CelsiusSensor {
  constructor(fahrenheitSensor) {
    super();
    this.fahrenheitSensor = fahrenheitSensor;
  }

  getCelsiusTemp() {
    const fahrenheitTemp = this.fahrenheitSensor.getFahrenheitTemp();
    const celsiusTemp = ((fahrenheitTemp - 32) * 5) / 9;
    console.log(`Current temperature is ${celsiusTemp}°C`);
    return celsiusTemp;
  }
}

// Client (사용자)
class Client {
  constructor(celsiusSensor) {
    this.celsiusSensor = celsiusSensor;
  }

  logTemperature() {
    this.celsiusSensor.getCelsiusTemp();
  }
}

const fahrenheitSensor = new FahrenheitSensor();
const adapter = new FahrenheitToCelsiusAdapter(fahrenheitSensor);
const client = new Client(adapter);

client.logTemperature();

// 즉 const client = new Client(new FahrenheitToCelsiusAdapter(new FahrenheitSensor()););

0개의 댓글