본문 바로가기
OOD/Structural Design Patterns(구조패턴)

Adapter Pattern (어뎁터 패턴)

by Box 2021. 11. 22.
728x90

어댑터 패턴 (adapter pattern)

  • 한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다.
  • 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.
  • 어댑터 패턴은 서로 다른 인터페이스를 가진 두 클래스를
    어댑터 클래스로 인터페이스를 통일 시켜 사용하는 방법이다.

장점

  • 기존 클라이언트 단의 코드 수정 최소화.
  • 클라이언트는 연동부분을 몰라도, 새로운 코드의 기능을 일관되게 사용가능.

단점

  • 어댑터 클래스에서 통일 시켜주는 부분을 하나씩 구현해야 함.

 활용 상황

  • 기존의 코드에 새로운 코드(써드파티 라이브러리 등)을 연동하여 사용하고 싶은데, 두 코드의 인터페이스가 달라, 이를 하나로 통일하여 사용하고 싶을 때.
  • 아래 예의 경우, 기존의 클라이언트 단 코드에 맞춰 통일함.

Ts 기반입니다

interface Duck {
     quack();
     fly() 
}

class mallerDuck implements Duck {
    public quack(){
        return console.log("꽥 꽦")
    }

    public fly(){
        return console.log("나는 오리")
    }
}
interface Turky {
     gobble()
     fly2() 
}

class wildTucky implements Turky {
    public gobble(){
        return console.log("칠 맨조!")
    }

    public fly2(){
        return  console.log("나는 칠맨죠")
    }
}

Adapter:

  • client 와 adapter 중간에서 호환성이 없는 둘을 연결시켜주는 역할을 담당
  • Target Interface를 implements 하며, 클라이언트는 target interface를 통해 어댑터에 요청을 보냅니다.
  • 어댑터는 clinet 의 요청을 adapter 가 이해 할수있는 방법으로 전달하고, 처리는 adapter에서 이루어진다
class TurkyAdapter implements Duck{
    constructor(private turky:Turky){}

    public TurkyAdapter(turky:Turky): void{
        console.log("#")
        this.turky = turky
    }

    public quack(){
        console.log("@")
        turky.gobble()
    }
    public fly(){
        turky.fly2()
    }
}

const turky = new wildTucky()
turky.gobble();
turky.fly2();

const test = new TurkyAdapter(turky)
test.quack();
test.fly()

실행 경과

  • 같은 output이 나온다.