장식자 디자인패턴
- 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다.
클래스 설명
어플리케이션을 제작할 때 가끔 개별적인 객체에 새로운 책임을 추가할 필요가 있다. 이렇게 새로운 서비스의 추가가 필요할 때 이를 해결하기 위해서 일반적인 방법으로 상속을 많이 사용한다. 즉 이미 존재하는 클래스를 상속받고, 또 다른 클래스에서 테두리 속성을 상속받아 이 서브클레스의 인스턴스에 테두리가 있도록 하는 방법이다. 그러나 별로 유용하지 않다. 이는 테두리의 선택이 유연하지 못하고 정적이기 때문이다.
더 나은 방법은 지금 필요한 테두리를 추가하는 다른 객체에다가 해당 구성요소를 둘러싸는 것이다. 이렇게 무엇인가를 감싸는 객체를 장식자라고 한다. Wrapper 라고도 불린다.
스크롤바가 없는 TextView 클래스가 있다고 가정하자. 스크롤 기능이 필요하게 된다면, ScrollDecorator 클래스를 이용해서 TextView에 스크롤바를 추가할 수 있다. 또 두꺼운 테두리가 필요하면 BorderDecorator 클래스를 TextView에 추가함으로써 문제를 해결할 수 있다.
클래스 사용방법
장식자가 필요한 기본구성
var textView: TextView = new TextView();
var app: AppClass = new AppClass();
app.setContents( textView );
addChild( textView );
addChild( app );
장식자사용
var textView: TextView = new TextView(); //텍스트필드
var scroll: ScrollDecorator = new ScrollDecorator(textView); //스크롤 추가
var border: BorderDecorator = new BorderDecorator(scroll); //테두리 추가
app.setContents( border );
addChild( scroll );
addChild( border );
addChild( app );
클래스 구성
//장식자 인터페이스
package
{
public interface VisualComponent
{
function draw(): void;
function resize(): void;
}
}
//장식자 인터페이스 서브클래스
package
{
public class Decorator implements VisualComponent
{
private var _component: VisualComponent;
public function Decorator( c: VisualComponent)
{
_component = c;
}
public function draw(): void
{
_component.draw();
}
public function resize(): void
{
_component.resize();
}
//이하 생략...
}
}
//TextView 클래스
package
{
public class TextView Extends Sprite
{
private var _component: VisualComponent;
public function BorderDecorator( c: VisualComponent )
{
_component = c;
draw();
}
public function draw(): void
{
}
}
}
//ScrollDecorator 장식자 서브클래스
package
{
public class ScrollDecorator Extends Decorator
{
private var _component: VisualComponent;
public function BorderDecorator( c: VisualComponent )
{
_component = c;
draw();
}
public function draw(): void
{
}
}
}
//BorderDecorator 장식자 서브클래스
package
{
public class BorderDecorator Extends Decorator
{
private var _component: VisualComponent;
private var _width: Number;
public function BorderDecorator( c: VisualComponent, w: Number )
{
_component = c;
_width = w;
draw();
}
public function draw(): void
{
}
}
}
관련패턴
객체의 책임과 행도을 변화 <-------> 적응자패턴은 인터페이스를 변경.
복합체로 볼 수 있으나 객체에 새로운 행동을 추가하는데 목적 <-------> 복합체패턴은 객체의 합성.
객체의 겉모양을 변경 <-------> 전략패턴은 객체의 내부를 변화.
'디자인 패턴' 카테고리의 다른 글
디자인패턴 : Factory Method (0) | 2011.08.03 |
---|---|
디자인패턴 : Adapter (0) | 2011.08.03 |
디자인패턴 : Proxy (0) | 2011.08.03 |
디자인패턴 : Strategy (0) | 2011.08.03 |
GOF 의 디자인패턴 (0) | 2010.10.25 |