Adapter Pattern

윤세영·2023년 7월 6일
0

DesignPattern

목록 보기
8/15

정의

  • 한 class의 interface를 client에서 필요로 하는 다른 interface로 변환한다. Adapter를 이용하면 interface 호환성문제로 쓸 수 없는 class들을 연결해서 쓸 수 있다.
  • 위 그림과 같이 Adapter의 소스만 변경하여 Existing System과 Vender Class를 연결해 준다.
Class Adapter Pattern
  • 장점 : Adapter 전체를 다시 구현할 필요가 없다.
  • 단점 : 상속을 활용하기 때문에 유연성이 떨어진다.
    (java는 다중상속 -지원 X)
  • Class Adapter에서는 다중 상속을 이용하기 때문에 JAVA에서는 사용할 수 없다 (간접적 다중상속 지원 à Interface를 이용)
Object Adapter Pattern
  • 장점 : Composition을 사용하기 때문에 유연성이 뛰어나다.
  • 단점 : Adapter Class의 대부분의 코드를 구현해야 하기 때문에 효율성이 떨어진다.

사용방법

  • Client에서 Target Interface를 사용하여 method를 호출함으로써 adapter에 요청을 한다.

  • Adapter에서는 adapter interface를 사용하여 그 요청을 adapter에 대한 하나 이상의 메소드를 호출로 변환한다.

  • Client에서는 호출 결과를 받긴 하지만 중간에 Adapter의 역할이 있었는지 전혀 알 수 없다.

  • 기존의 Duck interface

public interface Duck {
         public void quack();

         public void fly();
}
  • Duck interface를 implement하는 MallardDuck
public class MallardDuck implements Duck{
    @Override
    public void fly() {
     // TODO Auto-generated method stub
     System.out.println("Quack");
    }
 
    @Override
    public void quack() {
     // TODO Auto-generated method stub
     System.out.println("I'm flying");
    }
}
  • 하지만 turkey가 오고싶다. 그래서 interface를 만들어준다.
public interface Turkey {
    public void gobble();
    public void fly();
}
  • 그 후, Duck interface를 사용하기 위해 Adapter를 사용한다.
public class TurkeyAdapter implements Duck{
    Turkey turkey;
     public TurkeyAdapter(Turkey turkey){
     this.turkey=turkey;
    }
     @Override
    public void quack() {
     turkey.gobble();
    }         
    @Override
    public void fly() {
     turkey.fly();
    }
}
  • Turkey interface를 implements 하는 WildTurkey
public class WildTurkey implements Turkey{
    @Override
    public void fly() {
     // TODO Auto-generated method stub
     System.out.println("Gobble gobble");
    }
    @Override
    public void gobble() {
     // TODO Auto-generated method stub
     System.out.println("I'm flying a short distance");
    }
}
  • Main
public class DuckTestDrive {
    public static void main(String[] args) {
     MallardDuck duck = new MallardDuck();
     WildTurkey turkey = new WildTurkey();
     Duck turkeyAdapter = new TurkeyAdapter(turkey);
     
     System.out.println("The turkey says...");
     turkey.gobble();
     turkey.fly();
     System.out.println("The Duck says...");
     testDuck(duck);
     System.out.println("The TurkeyAdapter says...");
     testDuck(turkeyAdapter);
    }
    
    public static void testDuck(Duck duck){
     duck.quack();
     duck.fly();
    }
}

결과 화면

The turkey says...

I'm flying a short distance

Gobble gobble

The Duck says...

I'm flying

Quack

The TurkeyAdapter says...

I'm flying a short distance

Gobble gobble

UML

profile
Frontend

0개의 댓글