본문 바로가기

디자인 패턴

디자인패턴 : Adapter


적응자 디자인패턴

 - 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래들이 함께 작동하도록 해준다.

클래스 설명

스테이지에 도형을 그린다고 가정했을 때 동그라미, 세모는 동일한 인터페이스를 갖는데, 네모만 예전에 만들었던 클래스를 사용한다고 하자. 그런데 네모를 draw 해주는 메서드가 동그라미와 세모랑 다른 경우, 네모클래스 내부 메서드를 수정하면 쉽게 해결 되겠지만, 다른 업체에서 제공해주는 API인 경우 수정할 수 없을 때가 발생한다. 이렇듯 개발된 클래스의 인터페이스를 수정할 수 없을 때, 일반적인 프로그래밍에서는 각 도형들의 인터페이스를 맞도록 두가지 방법을 사용해서 해결할 수 있다. 클래스 구조 적응자 패턴과 객체 구조 적응자 패턴이다.

아래 구성 클래스를 예시로 사용한다.

첫번째 방법( 클래스 구조 적응자 패턴) - adapter( TextShape ) 클래스가 Shape 클래스와 TextView 클래스를 모두 상속받는 방법이 있다. 아쉽게도 액션스크립트에서는 다중 상속을 지원하지 않는다. 이방법의 장점은 adapter( TextShape )를 양방향 적응자로 사용할수 있다. 단 적응당하는 확장클래스의 기능은 사용하지 못한다.

두번째 방법( 객체 구조 적응자 패턴 ) - adapter( TextShape ) 클래스가 Shape 클래스만 상속받고, TextView 클래스는 인스턴스로 받아 합성하는 방식이다. 양방향 적응자로 활용활 수 없지만, 적응당하는 확장 클래스의 기능을 사용할 수 있다는 이점이 있다. 클래스 구조 적응자보다 좀 더 융통성있는 패턴이라고 할 수 있다.

클래스 사용법

var bottomLeft: Point = new Point(50, 0);//x=50, y=0
var topRight: Point    = new Point(0, 50);//x=0, y=50

var shape: Shape     = new Shape();
shape.boundingBox( bottomLeft, topRight ); 

var textView: TextView = new TextView();
textView.boundingBox( bottomLeft, topRight  ); //사용불가 

var textShape: TextShape = new TextShape();
textShape.boundingBox( bottomLeft, topRight  ); //적응시킨 후 사용가능

클래스 구성
 

//Target( Shape ) : 사용자가 사용할 응용 분야에 종속적인 인터페이스를 정의하는 클래스로서, Shape를 예로 들 수 있다. 
package
{
     public class Shape
     {
          public function Shape()
          {

          }
          public function BoundingBox( bottomLeft: Point, topRight: Point ): void
          {
               //내부구현 생략...
          }
     }


//Adaptee( TextView ) : 인터페이스의 적응이 필요한 기존 인터페이스를 정의하는 클래스로서, 적응대상자라고 한다. TextView가 예가 될 수 있다. 
package
{
     public class TextView
     {
          public function TextView()
          {              

          }
          public function getOrigin( tx: Number, ty: Number ): void
          {
               //내부구현 생략...
          }
          public function getExtent( tw: Number, th: Number ): void
          {
               //내부구현 생략...
          }
          public function isEmpty(): Boolean
          {

          }
     }


//Adapter( TextShape ) : Target 인터페이스에 Adaptee의 인터페이스를 적응시키는 클래스 
package
{
     public class TextShape extends Shape
     {
          private var _text: TextView; 

          public function TextShape( t: TextView )
          {
               _text = t;
          }
         override public function boundingBox( bottomLeft: Point, topRight: Point ): void
          {
               _text.setOrigin( bottomLeft.x, topRight.y);    //위치설정
               _text.setExtent( bottomLeft.x + topRight.x, topRight.y + bottomLeft.y);    //넓이설정
          }
          public function isEmpty(): Boolean
          {
               return _text.isEmpty();
          }
     }
}

'디자인 패턴' 카테고리의 다른 글

디자인패턴 : Facade  (0) 2011.08.03
디자인패턴 : Factory Method  (0) 2011.08.03
디자인패턴 : Decorator  (0) 2011.08.03
디자인패턴 : Proxy  (0) 2011.08.03
디자인패턴 : Strategy  (0) 2011.08.03