어댑터(Adapter)패턴: 구조패턴
한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.
특정 인터페이스를 지원하지 않는 대상 객체를 인터페이스를 지원하는 Adapter에 집어넣어서 사용하는 방법이라 할 수 있다. 기존 앱에 호환되지 않는 구현 인터페이스를 어댑터처럼 연결해주는 것!
Clinet가 Target의 인터페이스를 토대로 사용할 때, Adaptee 구현체를 Target의 작동방식과 동일하게 만들어야 할 것이다. 이때 Adapter을 통해서 동일하게 동작하도록 연결해준다.
이럴 경우 어댑터 패턴을 적용시킬 수 있다!
- 두 클래스가 동일하거나 유사한 작업을 수행하지만 인터페이스가 서로 다른 경우.
- 두 클래스가 공통 인터페이스를 가지면, 클라이언트 코드가 더 간단하고 명료해질 수 있는 경우.
- 외부 라이브러리라서 인터페이스를 바꾸고 싶어도 쉽게 바꿀 수 없는 경우, 또는 인터페이스가 프레임워크의 일부라서 이미 많은 클라이언트에서 사용되고 있는 경우, 또는 소스 코드를 갖고 있지 않는 경우.
어댑터 패턴의 장단점
장점:
- 어댑터 패턴은 구조 패턴 중 하나로 기존 클래스를 감싼 새로운 클래스를 생성한다. 그리고 새로운 클래스로 객체의 인터페이스를 재구성한다.
- 객체를 구성으로 결합하면 느슨한 연결 방식으로 보다 많은 유연성을 확보할 수 있다. 그리고 구성은 프로그램이 실행되는 도중에도 객체를 변경할 수 있다.
- 어댑터는 복잡한 객체 구조를 깔끔하게 정리하는 데 유용하다.
단점:
- 객체를 구성으로 결합하면 어댑터는 클라이언트에서 사용하는 인터페이스 방식으로 메서드를 새로 생성한다. 어댑터가 새로운 메서드를 재구성할 때 추가 코드가 필요하다.
- 프로젝트에서 어댑터 패턴을 적용한다고 코드의 성능이 개선되지는 않는다. 오히려 어댑터를 통해야 하므로 속도가 저하된다.
어댑터 패턴의 예시
Animal
public interface Animal {
public void sound();
public void eat();
}
Dog
public class Dog implements Animal{
@Override
public void sound() {
System.out.println("멍멍!");
}
@Override
public void eat() {
System.out.println("사료를먹는다.");
}
}
이렇게 동물에 대한 구조가 구성됐다고 해보자. 이때 다른 업체에서 사자를 추가해달라며 구현 인터페이스를 준다.
Carnivore
public interface Carnivore {
public void howl();
public void takeMeat();
}
Lion
public class Lion implements Carnivore{
@Override
public void howl() {
System.out.println("으르렁ㅇ~");
}
@Override
public void takeMeat() {
System.out.println("고기를먹는중");
}
}
동물 구조와 비슷해보인다. 하지만 이걸 적용하기에는 어려워 보인다. 이때 Adapter 패턴을 사용하면 된다.
LionAdapter
public class LionAdapter implements Animal{
Lion lion;
public LionAdapter(Lion lion){
this.lion = lion;
}
@Override
public void sound() {
this.lion.howl();
}
@Override
public void eat() {
this.lion.takeMeat();
}
}
Client
public class Client {
public static void main(String[] args) {
Animal dog = new Dog();
dog.sound();
dog.eat();
Carnivore lion = new Lion();
lion.howl();
lion.takeMeat();
Animal lionAdapter = new LionAdapter(new Lion());
lionAdapter.sound();
lionAdapter.eat();
}
}
Reference
'OOP > Design Pattern' 카테고리의 다른 글
09. 데코레이터(Decorator) 패턴 (0) | 2023.02.14 |
---|---|
08. 컴포지트(Composite) 패턴 (0) | 2023.02.14 |
06. 싱글톤(Singleton)패턴 (0) | 2023.02.13 |
05. 프로토타입(Prototype) 패턴 (0) | 2023.02.13 |
04. 빌더(Builder) 패턴 (0) | 2023.02.13 |