Adapter 패턴

Java Design Pattern 2013. 2. 19. 15:04

클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에  같이 없는 클래스들을 연결해서 있다.

 

, 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 사용할수 있는 방법을 제공한다.

다음 코드는 칠면조  오리와의 호환(?) 위해서 칠면조 어댑터 만든다.

칠면조 어댑터 오리의 인터페이스 구현하여 이를 사용하는 클라이언트는 기존의 오리의 행동으로  변경없이 칠면조를  제어할 있다.

내가 사용하려는 모듈에게 행동에 맞춰서 행동할수 있도록 Adapter 만들어주는데 그렇게 하기위해서는 Adapter 행동양식(Target클래스의 Interface) 구현하고 실제 모듈에게 행동을 위임할 있도록 Adoptee Reference 받는다고 생각하면 되겠다.

 

Client : 클라이언트(DuckTestDrive)에서는 오리한테 이야기하고 있다고 생각한다.

Adapter : Duck 인터패이스를 구현하지만 메소드가 호출 되었을때 호출을 Turkey메소드 호출로 변환해 준다.

 

 

 

 

다음 코드는 오리의 행동으로 캡슐화 하기위한 칠면조 Adapter이다. 이로서 이것을 사용하는 클라이언트 코드는 오리의 행동으로 칠면조 행동을 캡슐화 있다.

  

 

package headfirst.adapter.ducks;

 

/**

 * 칠면조를 위한 어댑터 클래스

 *

 * @author Steven J.S Min

 *

 */

public class TurkeyAdapter implements Duck {

       Turkey turkey;

 

       /**

        * 오리의 행동으로 칠면조행동을 변환하기위한 칠면조 Reference 받는다.

        *

        * @param turkey

        */

       public TurkeyAdapter(Turkey turkey) {

              this.turkey = turkey;

       }

 

       /*

        * 오리의 행동으로 칠면조에게 역할을 위임한다.

        *

        * @see headfirst.adapter.ducks.Duck#quack()

        */

       public void quack() {

              turkey.gobble();

       }

 

       /*

        * 오리의 행동으로 칠면조에게 역할을 위임한다.

        *

        * @see headfirst.adapter.ducks.Duck#fly()

        */

       public void fly() {

              for (int i = 0; i < 5; i++) {

                     turkey.fly();

              }

       }

}

 

 

다음은 칠면조에게 오리를 명령하는 것처럼 해동하는 클라이언드 코드이다.

 

package headfirst.adapter.ducks;

 

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("\nThe Duck says...");

              testDuck(duck);

 

              // 칠면조의 행동을 오리의 행동으로 캡슐화 하기위해서 Adapter 이용한다.

              // turkeyAdapter 오브젝트는 Duck 인터페이스를 구현한것이기 때문에 파라미터로 넘길수있다.

              System.out.println("\nThe TurkeyAdapter says...");

              testDuck(turkeyAdapter);

       }

 

       static void testDuck(Duck duck) {

              duck.quack();

              duck.fly();

       }

}

 

 

AdapterPattern.ucls

Duck.java

DuckAdapter.java

DuckTestDrive.java

MallardDuck.java

Turkey.java

TurkeyAdapter.java

TurkeyTestDrive.java

WildTurkey.java

'Java Design Pattern' 카테고리의 다른 글

Strategy 패턴 - 알고리즘을 사용하는 클라이언트와 독립적으로 구현  (0) 2013.02.20
Facade 패턴  (0) 2013.02.19
Command 패턴  (0) 2013.02.19
Singleton 패턴  (0) 2013.02.19
객체지향 설계의 원칙  (0) 2013.02.19
Posted by Steven J.S Min
,